croco-html 2.0.8 → 2.0.9

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.
@@ -0,0 +1,13 @@
1
+ import { Observable } from 'rxjs';
2
+ export function resizeObservable(elem, options) {
3
+ return new Observable((subscriber) => {
4
+ const resizeObserver = new ResizeObserver(([entry]) => {
5
+ subscriber.next(entry);
6
+ });
7
+ resizeObserver.observe(elem, options);
8
+ return function unsubscribe() {
9
+ resizeObserver.unobserve(elem);
10
+ };
11
+ });
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcm9jby1odG1sL3NyYy9saWIvY29tcG9uZW50cy94bWwtdGFncy94bWwtdGFnLWV4dGVybmFsLXZpZGVvL3Jlc2l6ZS1vYnNlcnZhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQWEsRUFBRSxPQUErQjtJQUM3RSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDbkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxXQUFXO1lBQ3pCLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZU9ic2VydmFibGUoZWxlbTogRWxlbWVudCwgb3B0aW9ucz86IFJlc2l6ZU9ic2VydmVyT3B0aW9ucyk6IE9ic2VydmFibGU8UmVzaXplT2JzZXJ2ZXJFbnRyeT4ge1xyXG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHtcclxuICAgICAgc3Vic2NyaWJlci5uZXh0KGVudHJ5KTtcclxuICAgIH0pO1xyXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtLCBvcHRpb25zKTtcclxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgcmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW0pO1xyXG4gICAgfTtcclxuICB9KTtcclxufVxyXG5cclxuIl19
@@ -1,8 +1,10 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input, signal, ViewChild } from '@angular/core';
2
+ import { resizeObservable } from "./resize-observable";
3
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
4
+ import { distinctUntilChanged, map } from "rxjs";
2
5
  import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/platform-browser";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@angular/youtube-player";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/youtube-player";
6
8
  export class XmlTagExternalVideoComponent {
7
9
  set data(value) {
8
10
  this.tagData = value.data;
@@ -12,8 +14,10 @@ export class XmlTagExternalVideoComponent {
12
14
  this.videoId = this.getYouTubeId(value.link);
13
15
  }
14
16
  ;
15
- constructor(_domSanitizer) {
16
- this._domSanitizer = _domSanitizer;
17
+ constructor(destroyRef) {
18
+ this.destroyRef = destroyRef;
19
+ this.playerWidth = signal(NaN);
20
+ this.playerHeight = signal(NaN);
17
21
  }
18
22
  ngOnInit() {
19
23
  const youtubeIframeApiUrl = 'https://www.youtube.com/iframe_api';
@@ -24,26 +28,37 @@ export class XmlTagExternalVideoComponent {
24
28
  tag.setAttribute('src', youtubeIframeApiUrl);
25
29
  document.body.appendChild(tag);
26
30
  }
31
+ if (this.playerContainerRef) {
32
+ resizeObservable(this.playerContainerRef.nativeElement)
33
+ .pipe(map(({ contentRect: { height, width } }) => ({ height, width })), distinctUntilChanged((a, b) => a.height === b.height && a.width === b.width), takeUntilDestroyed(this.destroyRef))
34
+ .subscribe(({ height, width }) => {
35
+ this.playerHeight.set(height);
36
+ this.playerWidth.set(width);
37
+ });
38
+ }
27
39
  }
28
40
  getYouTubeId(youtubeLink) {
29
41
  //https://www.youtube.com/watch?v=l3KfbfkxJOU
30
- if (youtubeLink.includes("watch?v=")) {
31
- const url = new URL(youtubeLink);
42
+ const url = new URL(youtubeLink);
43
+ if (url.pathname.endsWith('watch')) {
32
44
  return url.searchParams.get("v");
33
45
  }
34
46
  //https://youtu.be/jzBneaWSswY
35
- const bits = youtubeLink.split('/');
47
+ const bits = url.pathname.split('/');
36
48
  return bits[bits.length - 1];
37
49
  }
38
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagExternalVideoComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
39
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: XmlTagExternalVideoComponent, selector: "croco-html-xml-tag-external-video", inputs: { data: "data", tagData: "tagData" }, ngImport: i0, template: "<div class=\"d-flex justify-content-center\">\r\n <youtube-player height=\"100%\" width=\"100%\" class=\"y-video\" *ngIf=\"videoId\" [videoId]=\"videoId\"></youtube-player>\r\n</div>\r\n", styles: ["@media only screen and (min-width: 769px){.y-video{display:block;width:640px;height:360px;margin:0 auto}}@media only screen and (max-width: 827px){.y-video{display:block;width:100%;height:315px}}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "disableCookies", "loadApi", "disablePlaceholder", "showBeforeIframeApiLoads", "placeholderButtonLabel", "placeholderImageQuality"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagExternalVideoComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.4", type: XmlTagExternalVideoComponent, selector: "croco-html-xml-tag-external-video", inputs: { data: "data", tagData: "tagData" }, viewQueries: [{ propertyName: "playerContainerRef", first: true, predicate: ["playerContainer"], descendants: true, static: true }], ngImport: i0, template: "<div #playerContainer class=\"d-flex justify-content-center y-video\">\r\n <youtube-player [height]=\"playerHeight()\" [width]=\"playerWidth()\" *ngIf=\"videoId\" [videoId]=\"videoId\"></youtube-player>\r\n</div>\r\n", styles: ["@media only screen and (min-width: 769px){.y-video{display:block;width:640px;height:360px;margin:0 auto}}@media only screen and (max-width: 827px){.y-video{display:block;width:100%;height:315px}}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "disableCookies", "loadApi", "disablePlaceholder", "showBeforeIframeApiLoads", "placeholderButtonLabel", "placeholderImageQuality"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40
52
  }
41
53
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.4", ngImport: i0, type: XmlTagExternalVideoComponent, decorators: [{
42
54
  type: Component,
43
- args: [{ selector: 'croco-html-xml-tag-external-video', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"d-flex justify-content-center\">\r\n <youtube-player height=\"100%\" width=\"100%\" class=\"y-video\" *ngIf=\"videoId\" [videoId]=\"videoId\"></youtube-player>\r\n</div>\r\n", styles: ["@media only screen and (min-width: 769px){.y-video{display:block;width:640px;height:360px;margin:0 auto}}@media only screen and (max-width: 827px){.y-video{display:block;width:100%;height:315px}}\n"] }]
44
- }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { data: [{
55
+ args: [{ selector: 'croco-html-xml-tag-external-video', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #playerContainer class=\"d-flex justify-content-center y-video\">\r\n <youtube-player [height]=\"playerHeight()\" [width]=\"playerWidth()\" *ngIf=\"videoId\" [videoId]=\"videoId\"></youtube-player>\r\n</div>\r\n", styles: ["@media only screen and (min-width: 769px){.y-video{display:block;width:640px;height:360px;margin:0 auto}}@media only screen and (max-width: 827px){.y-video{display:block;width:100%;height:315px}}\n"] }]
56
+ }], ctorParameters: () => [{ type: i0.DestroyRef }], propDecorators: { data: [{
45
57
  type: Input
46
58
  }], tagData: [{
47
59
  type: Input
60
+ }], playerContainerRef: [{
61
+ type: ViewChild,
62
+ args: ['playerContainer', { static: true }]
48
63
  }] } });
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcm9jby1odG1sL3NyYy9saWIvY29tcG9uZW50cy94bWwtdGFncy94bWwtdGFnLWV4dGVybmFsLXZpZGVvL3htbC10YWctZXh0ZXJuYWwtdmlkZW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JvY28taHRtbC9zcmMvbGliL2NvbXBvbmVudHMveG1sLXRhZ3MveG1sLXRhZy1leHRlcm5hbC12aWRlby94bWwtdGFnLWV4dGVybmFsLXZpZGVvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7OztBQVdoRixNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLElBQW9CLElBQUksQ0FBQyxLQUFxQjtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUFBLENBQUM7SUFFRixJQUFvQixPQUFPLENBQUMsS0FBMkI7UUFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQUEsQ0FBQztJQUlGLFlBQW9CLGFBQTJCO1FBQTNCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO0lBQUksQ0FBQztJQUVwRCxRQUFRO1FBQ04sTUFBTSxtQkFBbUIsR0FBRyxvQ0FBb0MsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLG1CQUFtQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLDhGQUE4RjtZQUM5Riw2RUFBNkU7WUFDN0UsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLFdBQWtCO1FBRXJDLDZDQUE2QztRQUM3QyxJQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQztZQUNuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqQyxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBbkNVLDRCQUE0QjtrR0FBNUIsNEJBQTRCLHVIQ1h6Qyw2TEFHQTs7MkZEUWEsNEJBQTRCO2tCQU54QyxTQUFTOytCQUNFLG1DQUFtQyxtQkFHNUIsdUJBQXVCLENBQUMsTUFBTTtpRkFHM0IsSUFBSTtzQkFBdkIsS0FBSztnQkFJYyxPQUFPO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtEb21TYW5pdGl6ZXJ9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQge0ludGVyZmFjZUJsb2NrfSBmcm9tIFwiLi4vLi4vLi4vZXh0ZW5zaW9ucy9JbnRlcmZhY2VCbG9ja1wiO1xyXG5pbXBvcnQge0V4dGVybmFsVmlkZW9UYWdEYXRhfSBmcm9tICcuLi8uLi8uLi9leHRlbnNpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3JvY28taHRtbC14bWwtdGFnLWV4dGVybmFsLXZpZGVvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4veG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBYbWxUYWdFeHRlcm5hbFZpZGVvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IGRhdGEodmFsdWU6IEludGVyZmFjZUJsb2NrKSB7XHJcbiAgICB0aGlzLnRhZ0RhdGEgPSB2YWx1ZS5kYXRhO1xyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGFnRGF0YSh2YWx1ZTogRXh0ZXJuYWxWaWRlb1RhZ0RhdGEpIHtcclxuICAgIHRoaXMudmlkZW9JZCA9IHRoaXMuZ2V0WW91VHViZUlkKHZhbHVlLmxpbmspO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyB2aWRlb0lkPzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgeW91dHViZUlmcmFtZUFwaVVybCA9ICdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJztcclxuICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyYz1cIiR7eW91dHViZUlmcmFtZUFwaVVybH1cIl1gKSkge1xyXG4gICAgICAvLyBUaGlzIGNvZGUgbG9hZHMgdGhlIElGcmFtZSBQbGF5ZXIgQVBJIGNvZGUgYXN5bmNocm9ub3VzbHksIGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zIGF0XHJcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3lvdXR1YmUvaWZyYW1lX2FwaV9yZWZlcmVuY2UjR2V0dGluZ19TdGFydGVkXHJcbiAgICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICB0YWcuc2V0QXR0cmlidXRlKCdzcmMnLCB5b3V0dWJlSWZyYW1lQXBpVXJsKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRZb3VUdWJlSWQoeW91dHViZUxpbms6c3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICAvL2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9bDNLZmJma3hKT1VcclxuICAgIGlmKHlvdXR1YmVMaW5rLmluY2x1ZGVzKFwid2F0Y2g/dj1cIikpe1xyXG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHlvdXR1YmVMaW5rKTtcclxuICAgICAgcmV0dXJuIHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwidlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2h0dHBzOi8veW91dHUuYmUvanpCbmVhV1Nzd1lcclxuICAgIGNvbnN0IGJpdHMgPSB5b3V0dWJlTGluay5zcGxpdCgnLycpXHJcbiAgICByZXR1cm4gYml0c1tiaXRzLmxlbmd0aCAtIDFdO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICA8eW91dHViZS1wbGF5ZXIgaGVpZ2h0PVwiMTAwJVwiIHdpZHRoPVwiMTAwJVwiIGNsYXNzPVwieS12aWRlb1wiICpuZ0lmPVwidmlkZW9JZFwiIFt2aWRlb0lkXT1cInZpZGVvSWRcIj48L3lvdXR1YmUtcGxheWVyPlxyXG48L2Rpdj5cclxuIl19
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcm9jby1odG1sL3NyYy9saWIvY29tcG9uZW50cy94bWwtdGFncy94bWwtdGFnLWV4dGVybmFsLXZpZGVvL3htbC10YWctZXh0ZXJuYWwtdmlkZW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JvY28taHRtbC9zcmMvbGliL2NvbXBvbmVudHMveG1sLXRhZ3MveG1sLXRhZy1leHRlcm5hbC12aWRlby94bWwtdGFnLWV4dGVybmFsLXZpZGVvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULEtBQUssRUFDRyxNQUFNLEVBQ2QsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7QUFRL0MsTUFBTSxPQUFPLDRCQUE0QjtJQUN2QyxJQUFvQixJQUFJLENBQUMsS0FBcUI7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFBQSxDQUFDO0lBRUYsSUFBb0IsT0FBTyxDQUFDLEtBQTJCO1FBQ3JELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUFBLENBQUM7SUFTRixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSm5DLGdCQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLGlCQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBR1ksQ0FBQztJQUUvQyxRQUFRO1FBQ04sTUFBTSxtQkFBbUIsR0FBRyxvQ0FBb0MsQ0FBQztRQUNqRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLG1CQUFtQixJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLDhGQUE4RjtZQUM5Riw2RUFBNkU7WUFDN0UsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUM7aUJBQ3BELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFDaEUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQzVFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDcEM7aUJBQ0EsU0FBUyxDQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLEVBQUUsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsV0FBa0I7UUFFckMsNkNBQTZDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLElBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQztZQUNqQyxPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDOzhHQXJEVSw0QkFBNEI7a0dBQTVCLDRCQUE0Qiw0UENyQnpDLDJOQUdBOzsyRkRrQmEsNEJBQTRCO2tCQU54QyxTQUFTOytCQUNFLG1DQUFtQyxtQkFHNUIsdUJBQXVCLENBQUMsTUFBTTsrRUFHM0IsSUFBSTtzQkFBdkIsS0FBSztnQkFJYyxPQUFPO3NCQUExQixLQUFLO2dCQUcrQyxrQkFBa0I7c0JBQXRFLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDb21wb25lbnQsXHJcbiAgRGVzdHJveVJlZixcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCwgc2lnbmFsLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ludGVyZmFjZUJsb2NrfSBmcm9tIFwiLi4vLi4vLi4vZXh0ZW5zaW9ucy9JbnRlcmZhY2VCbG9ja1wiO1xyXG5pbXBvcnQge0V4dGVybmFsVmlkZW9UYWdEYXRhfSBmcm9tICcuLi8uLi8uLi9leHRlbnNpb25zJztcclxuaW1wb3J0IHtyZXNpemVPYnNlcnZhYmxlfSBmcm9tIFwiLi9yZXNpemUtb2JzZXJ2YWJsZVwiO1xyXG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCI7XHJcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY3JvY28taHRtbC14bWwtdGFnLWV4dGVybmFsLXZpZGVvJyxcclxuICB0ZW1wbGF0ZVVybDogJy4veG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veG1sLXRhZy1leHRlcm5hbC12aWRlby5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgWG1sVGFnRXh0ZXJuYWxWaWRlb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgcHVibGljIHNldCBkYXRhKHZhbHVlOiBJbnRlcmZhY2VCbG9jaykge1xyXG4gICAgdGhpcy50YWdEYXRhID0gdmFsdWUuZGF0YTtcclxuICB9O1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHRhZ0RhdGEodmFsdWU6IEV4dGVybmFsVmlkZW9UYWdEYXRhKSB7XHJcbiAgICB0aGlzLnZpZGVvSWQgPSB0aGlzLmdldFlvdVR1YmVJZCh2YWx1ZS5saW5rKTtcclxuICB9O1xyXG4gIEBWaWV3Q2hpbGQoJ3BsYXllckNvbnRhaW5lcicsIHtzdGF0aWM6IHRydWV9KSBwdWJsaWMgcGxheWVyQ29udGFpbmVyUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIHB1YmxpYyB2aWRlb0lkPzogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgcGxheWVyV2lkdGggPSBzaWduYWwoTmFOKTtcclxuICBwdWJsaWMgcGxheWVySGVpZ2h0ID0gc2lnbmFsKE5hTik7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlc3Ryb3lSZWYgOkRlc3Ryb3lSZWYpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHlvdXR1YmVJZnJhbWVBcGlVcmwgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XHJcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3lvdXR1YmVJZnJhbWVBcGlVcmx9XCJdYCkpIHtcclxuICAgICAgLy8gVGhpcyBjb2RlIGxvYWRzIHRoZSBJRnJhbWUgUGxheWVyIEFQSSBjb2RlIGFzeW5jaHJvbm91c2x5LCBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucyBhdFxyXG4gICAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS95b3V0dWJlL2lmcmFtZV9hcGlfcmVmZXJlbmNlI0dldHRpbmdfU3RhcnRlZFxyXG4gICAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgICAgdGFnLnNldEF0dHJpYnV0ZSgnc3JjJywgeW91dHViZUlmcmFtZUFwaVVybCk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGFnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wbGF5ZXJDb250YWluZXJSZWYpIHtcclxuICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLnBsYXllckNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50KVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKCh7IGNvbnRlbnRSZWN0OiB7IGhlaWdodCwgd2lkdGggfSB9KSA9PiAoeyBoZWlnaHQsIHdpZHRoIH0pKSxcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBhLmhlaWdodCA9PT0gYi5oZWlnaHQgJiYgYS53aWR0aCA9PT0gYi53aWR0aCksXHJcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSxcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoe2hlaWdodCx3aWR0aH0pID0+IHtcclxuICAgICAgICAgIHRoaXMucGxheWVySGVpZ2h0LnNldChoZWlnaHQpO1xyXG4gICAgICAgICAgdGhpcy5wbGF5ZXJXaWR0aC5zZXQod2lkdGgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRZb3VUdWJlSWQoeW91dHViZUxpbms6c3RyaW5nKTogc3RyaW5nIHtcclxuXHJcbiAgICAvL2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9bDNLZmJma3hKT1VcclxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeW91dHViZUxpbmspO1xyXG4gICAgaWYodXJsLnBhdGhuYW1lLmVuZHNXaXRoKCd3YXRjaCcpKXtcclxuICAgICAgcmV0dXJuIHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwidlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2h0dHBzOi8veW91dHUuYmUvanpCbmVhV1Nzd1lcclxuICAgIGNvbnN0IGJpdHMgPSB1cmwucGF0aG5hbWUuc3BsaXQoJy8nKVxyXG4gICAgcmV0dXJuIGJpdHNbYml0cy5sZW5ndGggLSAxXTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiAjcGxheWVyQ29udGFpbmVyIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgeS12aWRlb1wiPlxyXG4gIDx5b3V0dWJlLXBsYXllciBbaGVpZ2h0XT1cInBsYXllckhlaWdodCgpXCIgW3dpZHRoXT1cInBsYXllcldpZHRoKClcIiAqbmdJZj1cInZpZGVvSWRcIiBbdmlkZW9JZF09XCJ2aWRlb0lkXCI+PC95b3V0dWJlLXBsYXllcj5cclxuPC9kaXY+XHJcbiJdfQ==