@byuhbll/components 4.0.0-alpha.1 → 4.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/lib/animations/animations.mjs +1 -19
  2. package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +8 -6
  3. package/esm2022/lib/hbll-header/hbll-header.component.mjs +31 -74
  4. package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +3 -3
  5. package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +3 -3
  6. package/fesm2022/byuhbll-components.mjs +63 -674
  7. package/fesm2022/byuhbll-components.mjs.map +1 -1
  8. package/lib/animations/animations.d.ts +0 -1
  9. package/lib/hbll-checkbox/hbll-checkbox.component.d.ts +2 -2
  10. package/lib/hbll-header/hbll-header.component.d.ts +18 -26
  11. package/package.json +1 -4
  12. package/styles/scss/_mixins.scss +1 -1
  13. package/styles/scss/_vars.scss +0 -6
  14. package/styles/scss/base.scss +5 -8
  15. package/styles/scss/cta-btn.scss +2 -2
  16. package/styles/scss/pill-btn.scss +2 -2
  17. package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +0 -31
  18. package/esm2022/lib/hbll-header/impersonate-modal/impersonate-modal.component.mjs +0 -187
  19. package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +0 -307
  20. package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +0 -29
  21. package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +0 -31
  22. package/esm2022/lib/utils.mjs +0 -8
  23. package/lib/expand-collapse/expand-collapse.component.d.ts +0 -10
  24. package/lib/hbll-header/impersonate-modal/impersonate-modal.component.d.ts +0 -57
  25. package/lib/hbll-header/nav-bar/nav-bar.component.d.ts +0 -28
  26. package/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.d.ts +0 -12
  27. package/lib/hbll-header/pipes/library-hours.pipe.d.ts +0 -7
  28. package/lib/utils.d.ts +0 -5
  29. package/styles/scss/spinner.scss +0 -20
@@ -245,7 +245,7 @@ export class AdvancedSearchComponent {
245
245
  return this.advancedSearchForm.controls.expandResults.controls.applyEquivalentSubjects;
246
246
  }
247
247
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
248
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
249
249
  }
250
250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
251
251
  type: Component,
@@ -257,7 +257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
257
257
  HbllMultiSelectComponent,
258
258
  HbllCheckboxComponent,
259
259
  DateRangeComponent,
260
- ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"] }]
260
+ ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"] }]
261
261
  }], propDecorators: { config: [{
262
262
  type: Input,
263
263
  args: [{ required: true }]
@@ -270,4 +270,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
270
270
  type: ViewChild,
271
271
  args: [MatTooltip]
272
272
  }] } });
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUMvRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7QUFjeEUsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUM7QUFpQjFDLE1BQU0sT0FBTyx1QkFBdUI7SUFmcEM7UUFnQnFCLE9BQUUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQVMzQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBU3BELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU0xQzs7O1dBR0c7UUFDSyw0QkFBdUIsR0FBRyxDQUM5QixFQUtFLEVBQ0YsS0FBNEIsRUFDOUIsRUFBRTtZQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNqQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZO2lCQUN6QixJQUFJLENBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsRUFDL0IsR0FBRyxDQUFDLENBQUMsR0FBNEIsRUFBRSxFQUFFLENBQ2pDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0UsQ0FDSjtpQkFDQSxTQUFTLEVBQUUsQ0FDbkIsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVRLHVCQUFrQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDbEIsRUFBRSxFQUNGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQ3hEO1lBQ0QsS0FBSyxFQUFFLENBQUMsRUFBYyxDQUFDO1lBQ3ZCLFdBQVcsRUFBRSxDQUFDLEVBQWMsQ0FBQztZQUM3QixTQUFTLEVBQUUsQ0FBQyxFQUFvQyxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDZjtnQkFDSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUMvRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2FBQ2hGLEVBQ0QsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxDQUM1QztZQUNELFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ3hCLENBQUM7WUFDRixhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDcEIsQ0FBQztTQUNMLENBQUMsQ0FBQztRQUVPLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLDBCQUFxQixHQUFHLHVCQUF1QixDQUFDO1FBQ2hELDJCQUFzQixHQUFHLHlCQUF5QixDQUFDO1FBQ25ELCtCQUEwQixHQUFHLDZCQUE2QixDQUFDO1FBOEJyRTs7V0FFRztRQUNPLGFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBZ0MsQ0FBQztnQkFDNUUsS0FBSyxFQUFFO29CQUNILHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBR087aUJBQzFDO2dCQUNELFNBQVMsRUFBRTtvQkFDUCx1QkFBdUIsQ0FBQyxVQUFVLENBQzlCLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQyxDQUFDLENBQWtDO2lCQUN4QztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNuQyxDQUFDLENBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDO1FBRVEsZ0JBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ08sMEJBQXFCLEdBQUcsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEIsbUJBQW1CLEVBQUU7b0JBQ2pCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUI7b0JBQ2xDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7b0JBQzFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztvQkFDdkMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO29CQUN2QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7aUJBQzlDO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBRUY7O1dBRUc7UUFDTyw2QkFBd0IsR0FBRyxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUNsQixzQkFBc0IsRUFBRTtvQkFDcEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtvQkFDckMsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtvQkFDM0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO29CQUN2QyxZQUFZLEVBQUU7d0JBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztxQkFDeEM7b0JBQ0QsYUFBYSxFQUFFO3dCQUNYLHVCQUF1QixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLO3dCQUMzRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO3FCQUNoQztpQkFDSjthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ0ssMEJBQXFCLEdBQUcsR0FBRyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztvQkFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztnQkFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztnQkFDcEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztvQkFDZixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFFRjs7O1dBR0c7UUFDSyxxQkFBZ0IsR0FBRyxDQUFDLFlBQW1DLEVBQVEsRUFBRTtZQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4Qiw0REFBNEQ7WUFDNUQsSUFDSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQ3pDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM1QyxDQUFDO2dCQUNDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNuQyxPQUFPO1lBQ1gsQ0FBQztZQUNELHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUUxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDckIsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFDZCxHQUFHLFlBQVk7Z0JBQ2YsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFpQzthQUMxRSxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLENBQUM7UUFFTSxnQ0FBMkIsR0FBRyxHQUFHLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBRU0sY0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWhCLDREQUE0RDtZQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDakIsSUFBSSxDQUFDLE9BQU87aUJBQ1AsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3ZDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQzVELENBQUM7WUFFRix5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTTtnQkFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5RCxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsaUVBQWlFO2dCQUNqRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBRUQsdUJBQXVCO2dCQUN2QixZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVyRCxxQ0FBcUM7Z0JBQ3JDLElBQ0ksUUFBUSxDQUFDLEtBQUssSUFBSSwrREFBK0Q7b0JBQ2pGLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzt3QkFDeEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxPQUFPOzRCQUMxQixDQUFDLENBQUMsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs0QkFDbEQsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUUvRCxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDcEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFaEYsNERBQTREO2dCQUM1RCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUztvQkFDbkQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNwQyxRQUFRLENBQUMsU0FBUzt3QkFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUNqQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUVRLENBQ3ZDLENBQ1IsQ0FBQztnQkFFTix5REFBeUQ7Z0JBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTztvQkFDM0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBbUQsQ0FDdEYsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtxQkFDN0IsaUJBQW1ELENBQzNELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUMvRCxDQUFDO2dCQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUMzRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDTCxDQUFDLENBQUM7S0FDTDtJQXpTRyxJQUErQixNQUFNLENBQUMsTUFBb0I7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQVlELFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUF3REQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQy9ELENBQUM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMvRSxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMzRixDQUFDOzhHQXpHUSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwU0FpQnJCLFVBQVUsZ0RDNUZ6QixxK1ZBOFBBLDJ5RkQ1TFEsWUFBWSxtU0FDWixtQkFBbUIsNDFEQUNuQixnQkFBZ0IsNFRBQ2hCLGFBQWEsK0JBQ2Isd0JBQXdCLG9KQUN4QixxQkFBcUIscUZBQ3JCLGtCQUFrQjs7MkZBR2IsdUJBQXVCO2tCQWZuQyxTQUFTOytCQUNJLHdCQUF3QixjQUN0QixJQUFJLFdBR1A7d0JBQ0wsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsa0JBQWtCO3FCQUNyQjs4QkFLOEIsTUFBTTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT2YsY0FBYztzQkFBdkIsTUFBTTtnQkFHMkIsV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUlPLFlBQVk7c0JBQTFDLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOb25OdWxsYWJsZUZvcm1CdWlsZGVyLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyLFxuICAgIEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93LFxuICAgIEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvYWR2YW5jZWQtc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlULFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1tdWx0aS1zZWxlY3QvaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhibGxDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2hibGwtY2hlY2tib3gvaGJsbC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWNvbmZpZy5tb2RlbCc7XG5cbnR5cGUgUXVlcnlSb3cgPSB7XG4gICAgYm9vbGVhbjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uPjtcbiAgICBmaWVsZDogRm9ybUNvbnRyb2w8XG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvblxuICAgID47XG4gICAgcXVhbGlmaWVyOiBGb3JtQ29udHJvbDxBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbj47XG4gICAgcXVlcnk6IEZvcm1Db250cm9sPHN0cmluZz47XG59O1xuXG5jb25zdCBEQVRFX1ZBTElEQVRPUl9SRUdFWCA9ICdeWzAtOV17NH0kJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItc3MtYWR2YW5jZWQtc2VhcmNoJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQsXG4gICAgICAgIEhibGxDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiBbZmFsc2VdLFxuICAgICAgICAgICAgZnVsbFRleHQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIGlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoT3B0aW9ucyA9IEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwID0gQURWQU5DRURfU0VBUkNIX0ZJRUxEX01BUDtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfUVVBTElGSUVSX01BUDtcblxuICAgIGdldCBxdWVyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMucXVlcmllcztcbiAgICB9XG4gICAgZ2V0IHR5cGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMudHlwZXM7XG4gICAgfVxuICAgIGdldCBjb2xsZWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmNvbGxlY3Rpb25zO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGFuZ3VhZ2VzO1xuICAgIH1cbiAgICBnZXQgZnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGUuY29udHJvbHMuZnJvbTtcbiAgICB9XG4gICAgZ2V0IHRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZS5jb250cm9scy50bztcbiAgICB9XG4gICAgZ2V0IHBlZXJSZXZpZXdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmxpbWl0UmVzdWx0cy5jb250cm9scy5wZWVyUmV2aWV3ZWQ7XG4gICAgfVxuICAgIGdldCBmdWxsVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuZnVsbFRleHQ7XG4gICAgfVxuICAgIGdldCBhcHBseUVxdWl2YWxlbnRTdWJqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgcXVlcnkgdG8gYHF1ZXJpZXNgIGBGb3JtQXJyYXlgLiBUaGlzIEZvcm1Hcm91cCBoYXMgYW4gYWRkaXRpb25hbCBgYm9vbGVhbmAgY29udHJvbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUXVlcnkgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgYm9vbGVhbjogW0FEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmJvb2xlYW5bMF0gYXMgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uXSxcbiAgICAgICAgICAgICAgICBmaWVsZDogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5maWVsZHNbMF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVyOiBbXG4gICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5sb2NhbEZpZWxkc1swXVxuICAgICAgICAgICAgICAgICAgICBdWzBdIGFzIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zeW5jVXBGaWVsZEFuZFF1YWxpZmllcih0aGlzLnF1ZXJpZXMuYXQoLTEpLCB0aGlzLmNvbmZpZy5zY29wZSk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCByZW1vdmVRdWVyeSA9IChpOiBudW1iZXIpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnJlbW92ZUF0KGkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhcHByb3ByaWF0ZSBxdWVyeSBwYXJhbXMgYmVmb3JlIHBlcmZvcm1pbmcgYSBsb2NhbCBhZHZhbmNlZCBzZWFyY2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRvTG9jYWxBZHZhbmNlZFNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGxvY2FsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVzOiB0aGlzLnR5cGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sbGVjdGlvbnM6IHRoaXMuY29sbGVjdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4dGVybmFsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgbGltaXRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXJSZXZpZXdlZDogdGhpcy5wZWVyUmV2aWV3ZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBhbmRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmdWxsVGV4dDogdGhpcy5mdWxsVGV4dC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgQ29tcGFyZXMgJ2Zyb20nIGFuZCAndG8nIHRvIGVuc3VyZSAndG8nIGlzID49IHRvICdmcm9tJywgZWxzZSBzd2FwcyB0aGVtLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2F0aGVyVG9BbmRGcm9tVmFsdWVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSkgPD0gcGFyc2VJbnQodGhpcy50by52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMudG8udmFsdWUpID49IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGVyZSBpcyBhIHF1ZXJ5IHRvIHVzZSwgZ2F0aGVycyBhbGwgb3RoZXIgcXVlcnkgcGFyYW1ldGVycyBuZWVkZWQsIHRoZW4gcGVyZm9ybXMgYW4gYWR2YW5jZWQgc2VhcmNoIHZpYSBgcm91dGVyLm5hdmlnYXRlKClgLlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcXVlcnlQYXJhbXMgYmFzZSBzZXQgb2YgcXVlcnkgcGFyYW1zIHRvIG5hdmlnYXRlIHdpdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGRvQWR2YW5jZWRTZWFyY2ggPSAodXBkYXRlZFByb3BzOiBQYXJ0aWFsPFNlYXJjaENvbmZpZz4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBxdWVyeVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZCAmJlxuICAgICAgICAgICAgIXRoaXMucXVlcmllcy52YWx1ZS5zb21lKCh2KSA9PiAhIXYucXVlcnkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGUgZGF0ZSBmb3JtIGlzIHZhbGlkXG4gICAgICAgIGlmICh0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlLmludmFsaWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoLmVtaXQoe1xuICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAuLi51cGRhdGVkUHJvcHMsXG4gICAgICAgICAgICBhZHZhbmNlZFNlYXJjaFF1ZXJ5Um93czogdGhpcy5xdWVyaWVzLnZhbHVlIGFzIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3dbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5zaG93KCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0dXBGb3JtID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMuY2xlYXIoKTtcbiAgICAgICAgLy8gQWx3YXlzIGtlZXAgYXQgbGVhc3QgdHdvIHF1ZXJpZXMgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2YWxpZGF0aW9uIHRvb2x0aXAgY2xvc2VzIHdoZW4gdXNlcyBlbnRlcnMgYSBxdWVyeVxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXNcbiAgICAgICAgICAgICAgICAuYXQoMClcbiAgICAgICAgICAgICAgICAuY29udHJvbHMucXVlcnkudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLmlucHV0VG9vbHRpcCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiAodGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSB0cnVlKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSWYgbm8gYHF7TlVNfWAgdXNlIGBxYCBmb3IgZmlyc3QgcXVlcnlcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuc2V0VmFsdWUodGhpcy5jb25maWcucSk7XG5cbiAgICAgICAgdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MuZm9yRWFjaCgocXVlcnlSb3csIGkpID0+IHtcbiAgICAgICAgICAgIC8vIEFkZCBhIHF1ZXJ5IGZvcm0gY29udHJvbCBmb3IgZXZlcnkgcXtudW19IGtleSBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgICAgICBsZXQgcXVlcnlDb250cm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoLTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHF1ZXJ5IHZhbHVlLlxuICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHF1ZXJ5Um93LnF1ZXJ5KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBmaWVsZCB2YWx1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHF1ZXJ5Um93LmZpZWxkICYmIC8vIE9ubHkgc2V0IHRoZSBmaWVsZCBpZiB0aGUgdmFsdWUgYmVsb25ncyB0byB0aGUgY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgIChpc0FkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpc0FkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUocXVlcnlSb3cuZmllbGQpO1xuICAgICAgICAgICAgZWxzZSBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUodGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMuZmllbGRzWzBdKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWFsaWZpZXIgdmFsdWUsIGlmIGF2YWlsYWJsZSBhbmQgYSBsb2NhbCBzZWFyY2guXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCcgJiYgcXVlcnlSb3cucXVhbGlmaWVyKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWFsaWZpZXIuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5Um93LnF1YWxpZmllciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMucXVhbGlmaWVyc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQudmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9vbGVhbiwgaWYgYXZhaWxhYmxlIGFuZCBub3QgdGhlIGZpcnN0IHF1ZXJ5LlxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgcXVlcnlSb3cuYm9vbGVhbilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuYm9vbGVhbi5zZXRWYWx1ZShxdWVyeVJvdy5ib29sZWFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgdGhpcy50eXBlcy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkUmVzb3VyY2VUeXBlcyk7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRDb2xsZWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5jcmVhdGlvbkRhdGUuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnRvLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guY3JlYXRpb25EYXRlLnRvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLmZyb20pO1xuICAgICAgICAgICAgdGhpcy50by5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmRhdGVQdWJsaXNoZWQudG8pO1xuICAgICAgICAgICAgdGhpcy5wZWVyUmV2aWV3ZWQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5saW1pdFJlc3VsdHMucGVlclJldmlld2VkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHQuc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmZ1bGxUZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8Zm9ybVxuICAgIGRhdGEtdGVzdGlkPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICAoc3VibWl0KT1cImNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyA/IGRvTG9jYWxBZHZhbmNlZFNlYXJjaCgpIDogZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoKClcIlxuICAgIFtmb3JtR3JvdXBdPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICBjbGFzcz1cInNzLWFkdi1zZWFyY2gtd3JhcHBlclwiXG4+XG4gICAgPGgzPkFkdmFuY2VkIFNlYXJjaDwvaDM+XG4gICAgPCEtLSBRdWVyaWVzIC0tPlxuICAgIEBmb3IgKHF1ZXJ5IG9mIHF1ZXJpZXMuY29udHJvbHM7IHRyYWNrICRpbmRleDsgbGV0IHF1ZXJ5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNzLWFkdi1zZWFyY2gtcm93XCIgW2Zvcm1Hcm91cF09XCJxdWVyeVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIG9wZXJhdG9yIC0tPlxuICAgICAgICAgICAgPCEtLSBBZGQgYm9vbGVhbiBmb3IgZWFjaCByb3cgZXhjZXB0IGZvciBmaXJzdCAtLT5cbiAgICAgICAgICAgIEBpZiAoISRmaXJzdCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidib29sZWFuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInYm9vbGVhbicgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYm9vbGVhbiBvZiBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuYm9vbGVhbjsgdHJhY2sgYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiYm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib29sZWFuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBGaWVsZCAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5GaWVsZCB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJyA/ICdPbmxpbmUnIDogJ0xpYnJhcnknKSArICcgU3BlY2lmaWMnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUXVhbGlmaWVycyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHNlYXJjaGVzIC0tPlxuICAgICAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIiBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgID5NYXRjaCBDcml0ZXJpYSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidxdWFsaWZpZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJGFueSBiZWNhdXNlIGEgZmllbGQgY2FuIHRlY2huaWNhbGx5IGJlIGxvY2FsIG9yIGV4dGVybmFsLCB0aG91Z2ggdGhpcyBibG9jayBpcyBzY29wZWQgc3RyaWN0bHkgdG8gbG9jYWwgZmllbGRzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIG9mICRhbnkoYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnMpW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jb250cm9scy5maWVsZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgcXVhbGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25JbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJxdWFsaWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaWZpZXInICsgcXVlcnlJbmRleCArICctb3B0aW9uJyArIG9wdGlvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwKVtxdWFsaWZpZXJdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBRdWVyeSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5RdWVyeSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1xdWVyeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVlcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3F1ZXJ5JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnZhbGlkSW5wdXREZXNjXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Mtcm93LWNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUXVlcnkocXVlcnlJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInY2FuY2VsUm93JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGRRdWVyeSgpXCJcbiAgICAgICAgaWQ9XCJhZGRRdWVyeUJ0blwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYWRkUXVlcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPiAxMVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc3MtaWNvblwiPiBhZGQgPC9zcGFuPlxuICAgICAgICBBZGQgYSByb3dcbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIE9USEVSIE9QVElPTlMgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNzLW90aGVyLW9wdGlvbnNcIj5cbiAgICAgICAgPCEtLSBMT0NBTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIDwhLS0gVHlwZSAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXNvdXJjZVR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDQ+UmVzb3VyY2UgVHlwZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNzLW11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUmVzb3VyY2UgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiYWR2YW5jZWRTZWFyY2hPcHRpb25zLnR5cGVzW2NvbmZpZy5pbnN0aXR1dGlvbl1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJ0eXBlcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cInR5cGVzLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NvbGxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5jb2xsZWN0aW9uc1tjb25maWcuaW5zdGl0dXRpb25dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwiY29sbGVjdGlvbnMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJjb2xsZWN0aW9ucy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIExhbmd1YWdlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhbmd1YWdlQmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVCbG9jazsgY29udGV4dDogeyBoZWFkZXI6ICdDcmVhdGlvbiBEYXRlJyB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYVEVSTkFMIC0tPlxuICAgICAgICBAaWYgKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwibGltaXRSZXN1bHRzXCIgY2xhc3M9XCJzcy1jaGVja2JveC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkZvciBGZXdlciBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBQZWVyIHJldmlld2VkIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwicGVlclJldmlld2VkXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3BlZXJSZXZpZXdlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5QZWVyIHJldmlld2VkIGpvdXJuYWwgYXJ0aWNsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZXhwYW5kUmVzdWx0c1wiIGNsYXNzPVwic3MtY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgTW9yZSBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBBcHBseSBlcXVpdmFsZW50IHN1YmplY3RzIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidhcHBseUVxdWl2YWxlbnRTdWJqZWN0cydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5BcHBseSBlcXVpdmFsZW50IHN1YmplY3RzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPCEtLSBGdWxsIHRleHQgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3MtY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJmdWxsVGV4dFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3MtaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZnVsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2Z1bGxUZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1oYmxsLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwiZnVsbFRleHQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkluY2x1ZGUgcmVzdWx0cyB0aGUgbGlicmFyeSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlQmxvY2s7IGNvbnRleHQ6IHsgaGVhZGVyOiAnRGF0ZSBQdWJsaXNoZWQnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYW5ndWFnZUJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxhIFtocmVmXT1cIidodHRwczovL2xpYi5ieXUuZWR1L2Jyb3dzZS8nICsgY29uZmlnLmluc3RpdHV0aW9uXCI+QWxwaGFiZXRpYyBCcm93c2U8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG4tLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNsYW5ndWFnZUJsb2NrPlxuICAgIDxkaXY+XG4gICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgIFtsYWJlbF09XCInbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sYW5ndWFnZXNcIlxuICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJsYW5ndWFnZXMudmFsdWVcIlxuICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgID48L2xpYi1oYmxsLW11bHRpLXNlbGVjdD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RhdGVCbG9jayBsZXQtaGVhZGVyPVwiaGVhZGVyXCI+XG4gICAgPGRpdiBpZD1cImRhdGVPcHRpb25zXCIgY2xhc3M9XCJleHRlcm5hbFwiPlxuICAgICAgICA8aDQ+e3sgaGVhZGVyIH19PC9oND5cbiAgICAgICAgPGxpYi1kYXRlLXJhbmdlXG4gICAgICAgICAgICBbZnJvbV09XCJmcm9tLnZhbHVlXCJcbiAgICAgICAgICAgIFt0b109XCJ0by52YWx1ZVwiXG4gICAgICAgICAgICAoZnJvbUNoYW5nZSk9XCJmcm9tLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKHRvQ2hhbmdlKT1cInRvLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICA+PC9saWItZGF0ZS1yYW5nZT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVB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ZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOb25OdWxsYWJsZUZvcm1CdWlsZGVyLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyLFxuICAgIEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93LFxuICAgIEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvYWR2YW5jZWQtc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlULFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1tdWx0aS1zZWxlY3QvaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhibGxDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2hibGwtY2hlY2tib3gvaGJsbC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWNvbmZpZy5tb2RlbCc7XG5cbnR5cGUgUXVlcnlSb3cgPSB7XG4gICAgYm9vbGVhbjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uPjtcbiAgICBmaWVsZDogRm9ybUNvbnRyb2w8XG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvblxuICAgID47XG4gICAgcXVhbGlmaWVyOiBGb3JtQ29udHJvbDxBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbj47XG4gICAgcXVlcnk6IEZvcm1Db250cm9sPHN0cmluZz47XG59O1xuXG5jb25zdCBEQVRFX1ZBTElEQVRPUl9SRUdFWCA9ICdeWzAtOV17NH0kJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItc3MtYWR2YW5jZWQtc2VhcmNoJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQsXG4gICAgICAgIEhibGxDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiBbZmFsc2VdLFxuICAgICAgICAgICAgZnVsbFRleHQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIGlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoT3B0aW9ucyA9IEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwID0gQURWQU5DRURfU0VBUkNIX0ZJRUxEX01BUDtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfUVVBTElGSUVSX01BUDtcblxuICAgIGdldCBxdWVyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMucXVlcmllcztcbiAgICB9XG4gICAgZ2V0IHR5cGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMudHlwZXM7XG4gICAgfVxuICAgIGdldCBjb2xsZWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmNvbGxlY3Rpb25zO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGFuZ3VhZ2VzO1xuICAgIH1cbiAgICBnZXQgZnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGUuY29udHJvbHMuZnJvbTtcbiAgICB9XG4gICAgZ2V0IHRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZS5jb250cm9scy50bztcbiAgICB9XG4gICAgZ2V0IHBlZXJSZXZpZXdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmxpbWl0UmVzdWx0cy5jb250cm9scy5wZWVyUmV2aWV3ZWQ7XG4gICAgfVxuICAgIGdldCBmdWxsVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuZnVsbFRleHQ7XG4gICAgfVxuICAgIGdldCBhcHBseUVxdWl2YWxlbnRTdWJqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgcXVlcnkgdG8gYHF1ZXJpZXNgIGBGb3JtQXJyYXlgLiBUaGlzIEZvcm1Hcm91cCBoYXMgYW4gYWRkaXRpb25hbCBgYm9vbGVhbmAgY29udHJvbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUXVlcnkgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgYm9vbGVhbjogW0FEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmJvb2xlYW5bMF0gYXMgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uXSxcbiAgICAgICAgICAgICAgICBmaWVsZDogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5maWVsZHNbMF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVyOiBbXG4gICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5sb2NhbEZpZWxkc1swXVxuICAgICAgICAgICAgICAgICAgICBdWzBdIGFzIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zeW5jVXBGaWVsZEFuZFF1YWxpZmllcih0aGlzLnF1ZXJpZXMuYXQoLTEpLCB0aGlzLmNvbmZpZy5zY29wZSk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCByZW1vdmVRdWVyeSA9IChpOiBudW1iZXIpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnJlbW92ZUF0KGkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhcHByb3ByaWF0ZSBxdWVyeSBwYXJhbXMgYmVmb3JlIHBlcmZvcm1pbmcgYSBsb2NhbCBhZHZhbmNlZCBzZWFyY2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRvTG9jYWxBZHZhbmNlZFNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGxvY2FsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVzOiB0aGlzLnR5cGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sbGVjdGlvbnM6IHRoaXMuY29sbGVjdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4dGVybmFsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgbGltaXRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXJSZXZpZXdlZDogdGhpcy5wZWVyUmV2aWV3ZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBhbmRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmdWxsVGV4dDogdGhpcy5mdWxsVGV4dC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgQ29tcGFyZXMgJ2Zyb20nIGFuZCAndG8nIHRvIGVuc3VyZSAndG8nIGlzID49IHRvICdmcm9tJywgZWxzZSBzd2FwcyB0aGVtLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2F0aGVyVG9BbmRGcm9tVmFsdWVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSkgPD0gcGFyc2VJbnQodGhpcy50by52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMudG8udmFsdWUpID49IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGVyZSBpcyBhIHF1ZXJ5IHRvIHVzZSwgZ2F0aGVycyBhbGwgb3RoZXIgcXVlcnkgcGFyYW1ldGVycyBuZWVkZWQsIHRoZW4gcGVyZm9ybXMgYW4gYWR2YW5jZWQgc2VhcmNoIHZpYSBgcm91dGVyLm5hdmlnYXRlKClgLlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcXVlcnlQYXJhbXMgYmFzZSBzZXQgb2YgcXVlcnkgcGFyYW1zIHRvIG5hdmlnYXRlIHdpdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGRvQWR2YW5jZWRTZWFyY2ggPSAodXBkYXRlZFByb3BzOiBQYXJ0aWFsPFNlYXJjaENvbmZpZz4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBxdWVyeVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZCAmJlxuICAgICAgICAgICAgIXRoaXMucXVlcmllcy52YWx1ZS5zb21lKCh2KSA9PiAhIXYucXVlcnkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGUgZGF0ZSBmb3JtIGlzIHZhbGlkXG4gICAgICAgIGlmICh0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlLmludmFsaWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoLmVtaXQoe1xuICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAuLi51cGRhdGVkUHJvcHMsXG4gICAgICAgICAgICBhZHZhbmNlZFNlYXJjaFF1ZXJ5Um93czogdGhpcy5xdWVyaWVzLnZhbHVlIGFzIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3dbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5zaG93KCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0dXBGb3JtID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMuY2xlYXIoKTtcbiAgICAgICAgLy8gQWx3YXlzIGtlZXAgYXQgbGVhc3QgdHdvIHF1ZXJpZXMgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2YWxpZGF0aW9uIHRvb2x0aXAgY2xvc2VzIHdoZW4gdXNlcyBlbnRlcnMgYSBxdWVyeVxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXNcbiAgICAgICAgICAgICAgICAuYXQoMClcbiAgICAgICAgICAgICAgICAuY29udHJvbHMucXVlcnkudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLmlucHV0VG9vbHRpcCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiAodGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSB0cnVlKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSWYgbm8gYHF7TlVNfWAgdXNlIGBxYCBmb3IgZmlyc3QgcXVlcnlcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuc2V0VmFsdWUodGhpcy5jb25maWcucSk7XG5cbiAgICAgICAgdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MuZm9yRWFjaCgocXVlcnlSb3csIGkpID0+IHtcbiAgICAgICAgICAgIC8vIEFkZCBhIHF1ZXJ5IGZvcm0gY29udHJvbCBmb3IgZXZlcnkgcXtudW19IGtleSBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgICAgICBsZXQgcXVlcnlDb250cm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoLTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHF1ZXJ5IHZhbHVlLlxuICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHF1ZXJ5Um93LnF1ZXJ5KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBmaWVsZCB2YWx1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHF1ZXJ5Um93LmZpZWxkICYmIC8vIE9ubHkgc2V0IHRoZSBmaWVsZCBpZiB0aGUgdmFsdWUgYmVsb25ncyB0byB0aGUgY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgIChpc0FkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpc0FkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUocXVlcnlSb3cuZmllbGQpO1xuICAgICAgICAgICAgZWxzZSBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUodGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMuZmllbGRzWzBdKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWFsaWZpZXIgdmFsdWUsIGlmIGF2YWlsYWJsZSBhbmQgYSBsb2NhbCBzZWFyY2guXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCcgJiYgcXVlcnlSb3cucXVhbGlmaWVyKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWFsaWZpZXIuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5Um93LnF1YWxpZmllciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMucXVhbGlmaWVyc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQudmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9vbGVhbiwgaWYgYXZhaWxhYmxlIGFuZCBub3QgdGhlIGZpcnN0IHF1ZXJ5LlxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgcXVlcnlSb3cuYm9vbGVhbilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuYm9vbGVhbi5zZXRWYWx1ZShxdWVyeVJvdy5ib29sZWFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgdGhpcy50eXBlcy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkUmVzb3VyY2VUeXBlcyk7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRDb2xsZWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5jcmVhdGlvbkRhdGUuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnRvLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guY3JlYXRpb25EYXRlLnRvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLmZyb20pO1xuICAgICAgICAgICAgdGhpcy50by5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmRhdGVQdWJsaXNoZWQudG8pO1xuICAgICAgICAgICAgdGhpcy5wZWVyUmV2aWV3ZWQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5saW1pdFJlc3VsdHMucGVlclJldmlld2VkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHQuc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmZ1bGxUZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8Zm9ybVxuICAgIGRhdGEtdGVzdGlkPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICAoc3VibWl0KT1cImNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyA/IGRvTG9jYWxBZHZhbmNlZFNlYXJjaCgpIDogZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoKClcIlxuICAgIFtmb3JtR3JvdXBdPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICBjbGFzcz1cInNzLWFkdi1zZWFyY2gtd3JhcHBlclwiXG4+XG4gICAgPGgzPkFkdmFuY2VkIFNlYXJjaDwvaDM+XG4gICAgPCEtLSBRdWVyaWVzIC0tPlxuICAgIEBmb3IgKHF1ZXJ5IG9mIHF1ZXJpZXMuY29udHJvbHM7IHRyYWNrICRpbmRleDsgbGV0IHF1ZXJ5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNzLWFkdi1zZWFyY2gtcm93XCIgW2Zvcm1Hcm91cF09XCJxdWVyeVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIG9wZXJhdG9yIC0tPlxuICAgICAgICAgICAgPCEtLSBBZGQgYm9vbGVhbiBmb3IgZWFjaCByb3cgZXhjZXB0IGZvciBmaXJzdCAtLT5cbiAgICAgICAgICAgIEBpZiAoISRmaXJzdCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidib29sZWFuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInYm9vbGVhbicgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYm9vbGVhbiBvZiBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuYm9vbGVhbjsgdHJhY2sgYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiYm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib29sZWFuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBGaWVsZCAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5GaWVsZCB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJyA/ICdPbmxpbmUnIDogJ0xpYnJhcnknKSArICcgU3BlY2lmaWMnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUXVhbGlmaWVycyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHNlYXJjaGVzIC0tPlxuICAgICAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIiBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgID5NYXRjaCBDcml0ZXJpYSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidxdWFsaWZpZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJGFueSBiZWNhdXNlIGEgZmllbGQgY2FuIHRlY2huaWNhbGx5IGJlIGxvY2FsIG9yIGV4dGVybmFsLCB0aG91Z2ggdGhpcyBibG9jayBpcyBzY29wZWQgc3RyaWN0bHkgdG8gbG9jYWwgZmllbGRzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIG9mICRhbnkoYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnMpW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jb250cm9scy5maWVsZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgcXVhbGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25JbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJxdWFsaWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaWZpZXInICsgcXVlcnlJbmRleCArICctb3B0aW9uJyArIG9wdGlvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwKVtxdWFsaWZpZXJdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBRdWVyeSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5RdWVyeSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1xdWVyeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVlcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3F1ZXJ5JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnZhbGlkSW5wdXREZXNjXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Mtcm93LWNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUXVlcnkocXVlcnlJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInY2FuY2VsUm93JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGRRdWVyeSgpXCJcbiAgICAgICAgaWQ9XCJhZGRRdWVyeUJ0blwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYWRkUXVlcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPiAxMVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc3MtaWNvblwiPiBhZGQgPC9zcGFuPlxuICAgICAgICBBZGQgYSByb3dcbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIE9USEVSIE9QVElPTlMgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNzLW90aGVyLW9wdGlvbnNcIj5cbiAgICAgICAgPCEtLSBMT0NBTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIDwhLS0gVHlwZSAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXNvdXJjZVR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDQ+UmVzb3VyY2UgVHlwZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNzLW11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUmVzb3VyY2UgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiYWR2YW5jZWRTZWFyY2hPcHRpb25zLnR5cGVzW2NvbmZpZy5pbnN0aXR1dGlvbl1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJ0eXBlcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cInR5cGVzLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NvbGxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5jb2xsZWN0aW9uc1tjb25maWcuaW5zdGl0dXRpb25dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwiY29sbGVjdGlvbnMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJjb2xsZWN0aW9ucy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIExhbmd1YWdlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhbmd1YWdlQmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVCbG9jazsgY29udGV4dDogeyBoZWFkZXI6ICdDcmVhdGlvbiBEYXRlJyB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYVEVSTkFMIC0tPlxuICAgICAgICBAaWYgKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwibGltaXRSZXN1bHRzXCIgY2xhc3M9XCJzcy1jaGVja2JveC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkZvciBGZXdlciBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBQZWVyIHJldmlld2VkIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwicGVlclJldmlld2VkXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3BlZXJSZXZpZXdlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5QZWVyIHJldmlld2VkIGpvdXJuYWwgYXJ0aWNsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZXhwYW5kUmVzdWx0c1wiIGNsYXNzPVwic3MtY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgTW9yZSBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBBcHBseSBlcXVpdmFsZW50IHN1YmplY3RzIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidhcHBseUVxdWl2YWxlbnRTdWJqZWN0cydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5BcHBseSBlcXVpdmFsZW50IHN1YmplY3RzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPCEtLSBGdWxsIHRleHQgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3MtY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJmdWxsVGV4dFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3MtaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZnVsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2Z1bGxUZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1oYmxsLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwiZnVsbFRleHQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkluY2x1ZGUgcmVzdWx0cyB0aGUgbGlicmFyeSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlQmxvY2s7IGNvbnRleHQ6IHsgaGVhZGVyOiAnRGF0ZSBQdWJsaXNoZWQnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYW5ndWFnZUJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxhIFtocmVmXT1cIidodHRwczovL2xpYi5ieXUuZWR1L2Jyb3dzZS8nICsgY29uZmlnLmluc3RpdHV0aW9uXCI+QWxwaGFiZXRpYyBCcm93c2U8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG4tLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNsYW5ndWFnZUJsb2NrPlxuICAgIDxkaXY+XG4gICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgIFtsYWJlbF09XCInbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sYW5ndWFnZXNcIlxuICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJsYW5ndWFnZXMudmFsdWVcIlxuICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgID48L2xpYi1oYmxsLW11bHRpLXNlbGVjdD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RhdGVCbG9jayBsZXQtaGVhZGVyPVwiaGVhZGVyXCI+XG4gICAgPGRpdiBpZD1cImRhdGVPcHRpb25zXCIgY2xhc3M9XCJleHRlcm5hbFwiPlxuICAgICAgICA8aDQ+e3sgaGVhZGVyIH19PC9oND5cbiAgICAgICAgPGxpYi1kYXRlLXJhbmdlXG4gICAgICAgICAgICBbZnJvbV09XCJmcm9tLnZhbHVlXCJcbiAgICAgICAgICAgIFt0b109XCJ0by52YWx1ZVwiXG4gICAgICAgICAgICAoZnJvbUNoYW5nZSk9XCJmcm9tLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKHRvQ2hhbmdlKT1cInRvLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICA+PC9saWItZGF0ZS1yYW5nZT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=