UNPKG

@schoolbelle/common

Version:

Demo library to showcase Angular packaging format

282 lines (274 loc) 25 kB
import { Injectable, Component, forwardRef, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, Renderer2, NgModule } from '@angular/core'; import { HttpClient, HttpClientModule, HttpClientJsonpModule } from '@angular/common/http'; import { DomSanitizer } from '@angular/platform-browser'; import { FormGroup, FormControl, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule, COMPOSITION_BUFFER_MODE } from '@angular/forms'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AddressService { /** * @param {?} http * @param {?} sanitizer */ constructor(http, sanitizer) { this.http = http; this.sanitizer = sanitizer; } /** * @param {?} q * @return {?} */ search(q) { // const host = 'schoolbelle.local'; // const url = `https://api.poesis.kr/post/search.php?q=${q}&v=3.0.0-schoolbelle&ref=${host}`; const /** @type {?} */ apiKey = '906b6df16b1f8b0d02e4bbb4ec75ca02'; const /** @type {?} */ url = `${window.location.protocol}//apis.daum.net/local/v1/search/keyword.json?callback=JSON_CALLBACK&apikey=${apiKey}&query=${q}`; return this.http .jsonp(url, 'callback') .toPromise() .then((data) => { return (/** @type {?} */ (data.channel.item)).map(li => { return /** @type {?} */ ({ address: /** @type {?} */ ((li.address + ' ' + li.title + (li.zipcode ? ' (' + li.zipcode + ')' : ''))), lat: /** @type {?} */ (li.latitude), lng: /** @type {?} */ (li.longitude) }); }); }); } } AddressService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ AddressService.ctorParameters = () => [ { type: HttpClient, }, { type: DomSanitizer, }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ const /** @type {?} */ AddressInputComponentValueAccessor = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AddressInputComponent), multi: true }; class AddressInputComponent { /** * @param {?} addressService * @param {?} cdRef * @param {?} elementRef * @param {?} renderer */ constructor(addressService, cdRef, elementRef, renderer) { this.addressService = addressService; this.cdRef = cdRef; this.elementRef = elementRef; this.renderer = renderer; this.focused = true; this.disabled = false; this.onChange = _ => { }; this.onTouched = () => { }; this.addressSearchList = []; this.loading = false; this.subscriptions = []; } /** * @param {?} value * @return {?} */ writeValue(value) { if (value && typeof value === 'object') { this.value = value; setTimeout(() => this.renderer.setProperty(this.input, 'value', value.address)); } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} isDisabled * @return {?} */ setDisabledState(isDisabled) { this.disabled = isDisabled; if (this.disabled) this.address.disable(); else this.address.enable(); } /** * @return {?} */ createFormControls() { this.address = new FormControl(''); } /** * @return {?} */ createForm() { this.form = new FormGroup({ address: this.address }); } /** * @return {?} */ ngOnInit() { this.input = this.elementRef.nativeElement.querySelector('input'); this.createFormControls(); this.createForm(); this.subscriptions.push(this.address.valueChanges.subscribe(v => this.onChange(''))); this.subscriptions.push(this.address.valueChanges.subscribe(v => { if (v && v.length >= 2) { this.loading = true; this.cdRef.detectChanges(); } else { this.loading = false; this.cdRef.detectChanges(); } })); this.subscriptions.push(this.address.valueChanges .pipe(debounceTime(1000), distinctUntilChanged()) .subscribe(v => { if (v && v.length >= 2) { this.addressService .search(v) .then((list) => { this.addressSearchList = list; this.loading = false; this.cdRef.detectChanges(); }) .catch(() => { this.loading = false; this.cdRef.detectChanges(); }); } })); } /** * @return {?} */ ngOnDestroy() { this.subscriptions.forEach(sub => sub.unsubscribe()); } /** * @param {?} $event * @return {?} */ focus($event) { this.renderer.addClass(this.elementRef.nativeElement, 'focus'); setTimeout(() => { this.focused = true; this.cdRef.detectChanges(); }, 100); } /** * @param {?} $event * @return {?} */ blur($event) { this.renderer.removeClass(this.elementRef.nativeElement, 'focus'); setTimeout(() => { this.focused = false; this.cdRef.detectChanges(); }, 100); } /** * @param {?} li * @return {?} */ select(li) { this.value = li; this.renderer.setProperty(this.input, 'value', li.address); this.onChange(this.value); } } AddressInputComponent.decorators = [ { type: Component, args: [{ selector: 'address-input', template: `<form class="d-flex align-items-center" [formGroup]="form"> <input type="text" formControlName="address" placeholder="건물명, 지번 검색" class="w-100" (focus)="focus($event)" (blur)="blur($event)" /> <span *ngIf="loading" class="w-0 px-3"> <i class="fa fa-spinner fa-pulse fa-fw"></i> <span class="sr-only">Loading...</span> </span> <div class="dropdown-menu show" [ngClass]="{'show':focused && addressSearchList.length !== 0}"> <a *ngFor="let li of addressSearchList" class="dropdown-item" (click)="select(li)" > {{li.address}} </a> </div> </form> <!-- { "postcode5": "30100", "postcode6": "339011", "ko_common": "세종특별자치시", "ko_doro": "달빛로 174", "ko_jibeon": "아름동 1275", "en_common": "Sejong", "en_doro": "174, Dalbit-ro", "en_jibeon": "1275, Areum-dong", "building_id": "3611011300102730002000001", "building_name": "", "building_nums": "", "other_addresses": "아름초등학교", "road_id": "361103258103", "internal_id": "4739529" } --> `, styles: [`input{border:none;padding:.375em .75em;display:block;width:100%;line-height:1.5;color:#495057;text-align:inherit;background-color:transparent}input:focus{outline:0;box-shadow:none}input:disabled,textarea:disabled{color:#545454;cursor:default;background-color:#e9ecef;opacity:1}`], providers: [AddressInputComponentValueAccessor], changeDetection: ChangeDetectionStrategy.OnPush },] }, ]; /** @nocollapse */ AddressInputComponent.ctorParameters = () => [ { type: AddressService, }, { type: ChangeDetectorRef, }, { type: ElementRef, }, { type: Renderer2, }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class AddressInputModule { } AddressInputModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule, HttpClientModule, HttpClientJsonpModule, FormsModule, ReactiveFormsModule ], providers: [ AddressService, { provide: COMPOSITION_BUFFER_MODE, useValue: false } ], declarations: [AddressInputComponent], exports: [AddressInputComponent] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { AddressInputModule, AddressService, AddressInputComponent as ɵb, AddressInputComponentValueAccessor as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLWNvbXBvbmVudHMtYWRkcmVzcy1pbnB1dC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQHNjaG9vbGJlbGxlL2NvbW1vbi9jb21wb25lbnRzL2FkZHJlc3MtaW5wdXQvc3JjL2FkZHJlc3Muc2VydmljZS50cyIsIm5nOi8vQHNjaG9vbGJlbGxlL2NvbW1vbi9jb21wb25lbnRzL2FkZHJlc3MtaW5wdXQvc3JjL2FkZHJlc3MtaW5wdXQuY29tcG9uZW50LnRzIiwibmc6Ly9Ac2Nob29sYmVsbGUvY29tbW9uL2NvbXBvbmVudHMvYWRkcmVzcy1pbnB1dC9zcmMvYWRkcmVzcy1pbnB1dC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0luZm8ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGxhdDogbnVtYmVyO1xuICBsbmc6IG51bWJlcjtcbn1cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBZGRyZXNzU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50LCBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG4gIHB1YmxpYyBzZWFyY2gocTogc3RyaW5nKTogUHJvbWlzZTxBZGRyZXNzSW5mb1tdPiB7XG4gICAgLy8gY29uc3QgaG9zdCA9ICdzY2hvb2xiZWxsZS5sb2NhbCc7XG4gICAgLy8gY29uc3QgdXJsID0gIGBodHRwczovL2FwaS5wb2VzaXMua3IvcG9zdC9zZWFyY2gucGhwP3E9JHtxfSZ2PTMuMC4wLXNjaG9vbGJlbGxlJnJlZj0ke2hvc3R9YDtcblxuICAgIGNvbnN0IGFwaUtleSA9ICc5MDZiNmRmMTZiMWY4YjBkMDJlNGJiYjRlYzc1Y2EwMic7XG4gICAgY29uc3QgdXJsID0gYCR7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2xcbiAgICB9Ly9hcGlzLmRhdW0ubmV0L2xvY2FsL3YxL3NlYXJjaC9rZXl3b3JkLmpzb24/Y2FsbGJhY2s9SlNPTl9DQUxMQkFDSyZhcGlrZXk9JHthcGlLZXl9JnF1ZXJ5PSR7cX1gO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmpzb25wKHVybCwgJ2NhbGxiYWNrJylcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gKDxBcnJheTxhbnk+PmRhdGEuY2hhbm5lbC5pdGVtKS5tYXAobGkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRyZXNzOiAobGkuYWRkcmVzcyArXG4gICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgIGxpLnRpdGxlICtcbiAgICAgICAgICAgICAgKGxpLnppcGNvZGUgPyAnICgnICsgbGkuemlwY29kZSArICcpJyA6ICcnKSkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgbGF0OiBsaS5sYXRpdHVkZSBhcyBudW1iZXIsXG4gICAgICAgICAgICBsbmc6IGxpLmxvbmdpdHVkZSBhcyBudW1iZXJcbiAgICAgICAgICB9IGFzIEFkZHJlc3NJbmZvO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgZm9yd2FyZFJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWRkcmVzc1NlcnZpY2UsIEFkZHJlc3NJbmZvIH0gZnJvbSAnLi9hZGRyZXNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBBZGRyZXNzSW5wdXRDb21wb25lbnRWYWx1ZUFjY2Vzc29yOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBZGRyZXNzSW5wdXRDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWRkcmVzcy1pbnB1dCcsXG4gIHRlbXBsYXRlOiBgPGZvcm0gY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgXG5bZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgICAgICAgICBcbiAgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXG4gIHBsYWNlaG9sZGVyPVwiw6rCscK0w6vCrMK8w6vCqsKFLCDDrMKnwoDDq8Kywoggw6rCssKAw6zCg8KJXCJcbiAgY2xhc3M9XCJ3LTEwMFwiXG4gIChmb2N1cyk9XCJmb2N1cygkZXZlbnQpXCIgICAgICAgIFxuICAoYmx1cik9XCJibHVyKCRldmVudClcIiAgICAgICAgXG4gIC8+XG4gIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwidy0wIHB4LTNcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1wdWxzZSBmYS1md1wiPjwvaT5cbiAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkxvYWRpbmcuLi48L3NwYW4+XG4gIDwvc3Bhbj5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgc2hvd1wiIFtuZ0NsYXNzXT1cInsnc2hvdyc6Zm9jdXNlZCAmJiBhZGRyZXNzU2VhcmNoTGlzdC5sZW5ndGggIT09IDB9XCI+XG4gICAgPGEgKm5nRm9yPVwibGV0IGxpIG9mIGFkZHJlc3NTZWFyY2hMaXN0XCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdChsaSlcIiA+XG4gICAgICB7e2xpLmFkZHJlc3N9fVxuICAgIDwvYT5cbiAgPC9kaXY+XG48L2Zvcm0+XG5cbjwhLS0geyBcInBvc3Rjb2RlNVwiOiBcIjMwMTAwXCIsIFwicG9zdGNvZGU2XCI6IFwiMzM5MDExXCIsIFwia29fY29tbW9uXCI6IFwiw6zChMK4w6zCosKFw63CisK5w6vCs8KEw6zCnsKQw6zCucKYw6zCi8KcXCIsIFwia29fZG9yb1wiOiBcIsOrwovCrMOrwrnCm8OrwqHCnCAxNzRcIiwgXCJrb19qaWJlb25cIjogXCLDrMKVwoTDq8KmwoTDq8KPwpkgMTI3NVwiLCBcImVuX2NvbW1vblwiOiBcIlNlam9uZ1wiLCBcImVuX2Rvcm9cIjogXCIxNzQsIERhbGJpdC1yb1wiLCBcImVuX2ppYmVvblwiOiBcIjEyNzUsIEFyZXVtLWRvbmdcIiwgXCJidWlsZGluZ19pZFwiOiBcIjM2MTEwMTEzMDAxMDI3MzAwMDIwMDAwMDFcIiwgXCJidWlsZGluZ19uYW1lXCI6IFwiXCIsIFwiYnVpbGRpbmdfbnVtc1wiOiBcIlwiLCBcIm90aGVyX2FkZHJlc3Nlc1wiOiBcIsOswpXChMOrwqbChMOswrTCiMOrwpPCscOtwpXCmcOqwrXCkFwiLCBcInJvYWRfaWRcIjogXCIzNjExMDMyNTgxMDNcIiwgXCJpbnRlcm5hbF9pZFwiOiBcIjQ3Mzk1MjlcIiB9ICAgICAgIC0tPlxuYCxcbiAgc3R5bGVzOiBbYGlucHV0e2JvcmRlcjpub25lO3BhZGRpbmc6LjM3NWVtIC43NWVtO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtsaW5lLWhlaWdodDoxLjU7Y29sb3I6IzQ5NTA1Nzt0ZXh0LWFsaWduOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH1pbnB1dDpmb2N1c3tvdXRsaW5lOjA7Ym94LXNoYWRvdzpub25lfWlucHV0OmRpc2FibGVkLHRleHRhcmVhOmRpc2FibGVke2NvbG9yOiM1NDU0NTQ7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZC1jb2xvcjojZTllY2VmO29wYWNpdHk6MX1gXSxcbiAgcHJvdmlkZXJzOiBbQWRkcmVzc0lucHV0Q29tcG9uZW50VmFsdWVBY2Nlc3Nvcl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFkZHJlc3NJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG4gIHB1YmxpYyBmb2N1c2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdmFsdWU6IEFkZHJlc3NJbmZvO1xuICB3cml0ZVZhbHVlKHZhbHVlOiBBZGRyZXNzSW5mbykge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dCwgJ3ZhbHVlJywgdmFsdWUuYWRkcmVzcylcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIG9uQ2hhbmdlID0gXyA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB0aGlzLmFkZHJlc3MuZGlzYWJsZSgpO1xuICAgIGVsc2UgdGhpcy5hZGRyZXNzLmVuYWJsZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGFkZHJlc3NTZXJ2aWNlOiBBZGRyZXNzU2VydmljZSxcbiAgICBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cbiAgZm9ybTogRm9ybUdyb3VwO1xuICBhZGRyZXNzOiBGb3JtQ29udHJvbDtcbiAgYWRkcmVzc1NlYXJjaExpc3Q6IGFueVtdID0gW107XG4gIGNyZWF0ZUZvcm1Db250cm9scygpIHtcbiAgICB0aGlzLmFkZHJlc3MgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICB9XG4gIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBhZGRyZXNzOiB0aGlzLmFkZHJlc3NcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgdGhpcy5jcmVhdGVGb3JtQ29udHJvbHMoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuYWRkcmVzcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4gdGhpcy5vbkNoYW5nZSgnJykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuYWRkcmVzcy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHYgPT4ge1xuICAgICAgICBpZiAodiAmJiB2Lmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5hZGRyZXNzLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgIC5zdWJzY3JpYmUodiA9PiB7XG4gICAgICAgICAgaWYgKHYgJiYgdi5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzU2VydmljZVxuICAgICAgICAgICAgICAuc2VhcmNoKHYpXG4gICAgICAgICAgICAgIC50aGVuKChsaXN0OiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc1NlYXJjaExpc3QgPSBsaXN0O1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICB9XG4gIGZvY3VzKCRldmVudCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdmb2N1cycpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDEwMCk7XG4gIH1cbiAgYmx1cigkZXZlbnQpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZm9jdXMnKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHNlbGVjdChsaTogQWRkcmVzc0luZm8pIHtcbiAgICB0aGlzLnZhbHVlID0gbGk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmlucHV0LCAndmFsdWUnLCBsaS5hZGRyZXNzKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUsIEh0dHBDbGllbnRKc29ucE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERVxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEFkZHJlc3NJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vYWRkcmVzcy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuL2FkZHJlc3Muc2VydmljZSc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSHR0cENsaWVudE1vZHVsZSxcbiAgICBIdHRwQ2xpZW50SnNvbnBNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBBZGRyZXNzU2VydmljZSxcbiAgICB7IHByb3ZpZGU6IENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFLCB1c2VWYWx1ZTogZmFsc2UgfVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtBZGRyZXNzSW5wdXRDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQWRkcmVzc0lucHV0Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBBZGRyZXNzSW5wdXRNb2R1bGUge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOzs7OztJQVlFLFlBQW1CLElBQWdCLEVBQVMsU0FBdUI7UUFBaEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQWM7S0FBSTs7Ozs7SUFDaEUsTUFBTSxDQUFDLENBQVM7OztRQUlyQix1QkFBTSxNQUFNLEdBQUcsa0NBQWtDLENBQUM7UUFDbEQsdUJBQU0sR0FBRyxHQUFHLEdBQ1YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUNsQiw4RUFBOEUsTUFBTSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBRWxHLE9BQU8sSUFBSSxDQUFDLElBQUk7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