@covalent/markdown 4.0.0-beta.1 → 4.1.1-beta.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.
@@ -1,15 +1,17 @@
1
- import { AfterViewInit, ElementRef, EventEmitter, Renderer2, OnChanges, SimpleChanges } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, EventEmitter, Renderer2, OnChanges, SimpleChanges, NgZone, OnDestroy } from '@angular/core';
2
2
  import { DomSanitizer } from '@angular/platform-browser';
3
3
  import * as i0 from "@angular/core";
4
- export declare class TdMarkdownComponent implements OnChanges, AfterViewInit {
4
+ export declare class TdMarkdownComponent implements OnChanges, AfterViewInit, OnDestroy {
5
5
  private _renderer;
6
6
  private _elementRef;
7
7
  private _domSanitizer;
8
+ private _ngZone;
8
9
  private _content;
9
10
  private _simpleLineBreaks;
10
11
  private _hostedUrl;
11
12
  private _anchor;
12
13
  private _viewInit;
14
+ private _anchorListener?;
13
15
  /**
14
16
  * .td-markdown class added to host so ::ng-deep gets scoped.
15
17
  */
@@ -48,10 +50,10 @@ export declare class TdMarkdownComponent implements OnChanges, AfterViewInit {
48
50
  * Event emitted after the markdown content rendering is finished.
49
51
  */
50
52
  contentReady: EventEmitter<undefined>;
51
- constructor(_renderer: Renderer2, _elementRef: ElementRef, _domSanitizer: DomSanitizer);
52
- clickListener(event: Event): void;
53
+ constructor(_renderer: Renderer2, _elementRef: ElementRef, _domSanitizer: DomSanitizer, _ngZone: NgZone);
53
54
  ngOnChanges(changes: SimpleChanges): void;
54
55
  ngAfterViewInit(): void;
56
+ ngOnDestroy(): void;
55
57
  refresh(): void;
56
58
  /**
57
59
  * General method to parse a string markdown into HTML Elements and load them into the container
package/package.json CHANGED
@@ -1,35 +1,21 @@
1
1
  {
2
2
  "name": "@covalent/markdown",
3
- "version": "4.0.0-beta.1",
3
+ "version": "4.1.1-beta.3",
4
4
  "description": "Teradata UI Platform Markdown Module",
5
5
  "keywords": [
6
6
  "angular",
7
7
  "components",
8
- "reusable"
9
- ],
10
- "repository": {
11
- "type": "git",
12
- "url": "https://github.com/teradata/covalent.git"
13
- },
14
- "bugs": {
15
- "url": "https://github.com/teradata/covalent/issues"
16
- },
17
- "license": "MIT",
18
- "author": "Teradata UX",
19
- "contributors": [
20
- "Kyle Ledbetter <kyle.ledbetter@teradata.com>",
21
- "Richa Vyas <richa.vyas@teradata.com>",
22
- "Ed Morales <eduardo.morales@teradata.com>",
23
- "Jason Weaver <jason.weaver@teradata.com>",
24
- "Jeremy Wilken <jeremy.wilken@teradata.com>",
25
- "Jeremy Smartt <jeremy.smartt@teradata.com>",
26
- "Steven Ov <steven.ov@teradata.com>"
8
+ "reusable",
9
+ "markdown"
27
10
  ],
28
11
  "peerDependencies": {
29
- "showdown": "^1.9.1",
30
- "@angular/common": "^12.0.0-0 || ^13.0.0-0",
31
- "@angular/core": "^12.0.0-0 || ^13.0.0-0",
32
- "@angular/platform-browser": "^12.0.0-0 || ^13.0.0-0"
12
+ "showdown": "showdown@2.0.0-alpha",
13
+ "@angular/common": "^13.2.0",
14
+ "@angular/core": "^13.2.0",
15
+ "@angular/platform-browser": "^13.2.0"
16
+ },
17
+ "dependencies": {
18
+ "tslib": "^2.3.0"
33
19
  },
34
20
  "module": "fesm2015/covalent-markdown.mjs",
35
21
  "es2020": "fesm2020/covalent-markdown.mjs",
@@ -50,11 +36,5 @@
50
36
  "default": "./fesm2020/covalent-markdown.mjs"
51
37
  }
52
38
  },
53
- "sideEffects": false,
54
- "dependencies": {
55
- "tslib": "^2.3.0"
56
- },
57
- "scripts": {
58
- "prepublishOnly": "node --eval \"console.error('ERROR: Trying to publish a package that has been compiled by Ivy in full compilation mode. This is not allowed.\\nPlease delete and rebuild the package with Ivy partial compilation mode, before attempting to publish.\\n')\" && exit 1"
59
- }
39
+ "sideEffects": false
60
40
  }
package/public_api.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './markdown.module';
2
- export * from './markdown.component';
3
- export * from './markdown-utils/markdown-utils';
4
- export * from './markdown-loader/markdown-loader.service';
1
+ export * from './lib/markdown.module';
2
+ export * from './lib/markdown.component';
3
+ export * from './lib/markdown-utils/markdown-utils';
4
+ export * from './lib/markdown-loader/markdown-loader.service';
@@ -1,69 +0,0 @@
1
- @import '../../../node_modules/@angular/material/theming';
2
-
3
- @mixin covalent-markdown-theme($theme) {
4
- $accent: map-get($theme, accent);
5
- $foreground: map-get($theme, foreground);
6
- $background: map-get($theme, background);
7
-
8
- td-markdown {
9
- a {
10
- color: mat-color($accent);
11
- }
12
-
13
- h1,
14
- h2 {
15
- border-bottom-color: mat-color($foreground, divider);
16
- }
17
-
18
- h3,
19
- h4,
20
- h5,
21
- h6 {
22
- color: mat-color($foreground, secondary-text);
23
- }
24
-
25
- hr {
26
- border-color: mat-color($foreground, divider);
27
- }
28
-
29
- blockquote {
30
- color: mat-color($foreground, secondary-text);
31
- border-left-color: mat-color($foreground, divider);
32
- }
33
-
34
- table {
35
- th,
36
- td {
37
- border-color: mat-color($foreground, dividers);
38
- }
39
-
40
- tr {
41
- border-top-color: mat-color($foreground, dividers);
42
-
43
- &:nth-child(2n) {
44
- background-color: mat-color($foreground, dividers);
45
- }
46
- }
47
- }
48
-
49
- img {
50
- background-color: mat-color($background, card);
51
- }
52
-
53
- code {
54
- background-color: mat-color($background, hover);
55
- }
56
-
57
- .highlight pre,
58
- pre {
59
- background-color: mat-color($background, app-bar);
60
- }
61
-
62
- kbd {
63
- color: mat-color($foreground, secondary-text);
64
- background-color: mat-color($background, app-bar);
65
- border-color: mat-color($foreground, divider);
66
- border-bottom-color: mat-color($foreground, disabled);
67
- }
68
- }
69
- }
package/esm2020/index.mjs DELETED
@@ -1,2 +0,0 @@
1
- export * from './public_api';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vbWFya2Rvd24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
@@ -1,36 +0,0 @@
1
- import { Injectable, SecurityContext } from '@angular/core';
2
- import { DomSanitizer } from '@angular/platform-browser';
3
- import { HttpClient } from '@angular/common/http';
4
- import { isGithubHref, rawGithubHref } from '../markdown-utils/markdown-utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- import * as i2 from "@angular/platform-browser";
8
- export class TdMarkdownLoaderService {
9
- constructor(_http, _sanitizer) {
10
- this._http = _http;
11
- this._sanitizer = _sanitizer;
12
- }
13
- async load(url, httpOptions = {}) {
14
- const sanitizedUrl = this._sanitizer.sanitize(SecurityContext.URL, url);
15
- let urlToGet = sanitizedUrl;
16
- if (isGithubHref(sanitizedUrl)) {
17
- urlToGet = rawGithubHref(sanitizedUrl);
18
- }
19
- const response = await this._http
20
- .get(urlToGet, { ...httpOptions, responseType: 'text', observe: 'response' })
21
- .toPromise();
22
- const contentType = response.headers.get('Content-Type');
23
- if (contentType.includes('text/plain') || contentType.includes('text/markdown')) {
24
- return response.body;
25
- }
26
- else {
27
- throw Error(`${contentType} is not a handled content type`);
28
- }
29
- }
30
- }
31
- /** @nocollapse */ /** @nocollapse */ TdMarkdownLoaderService.ɵfac = function TdMarkdownLoaderService_Factory(t) { return new (t || TdMarkdownLoaderService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.DomSanitizer)); };
32
- /** @nocollapse */ /** @nocollapse */ TdMarkdownLoaderService.ɵprov = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjectable({ token: TdMarkdownLoaderService, factory: TdMarkdownLoaderService.ɵfac });
33
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TdMarkdownLoaderService, [{
34
- type: Injectable
35
- }], function () { return [{ type: i1.HttpClient }, { type: i2.DomSanitizer }]; }, null); })();
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tbG9hZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vbWFya2Rvd24vbWFya2Rvd24tbG9hZGVyL21hcmtkb3duLWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFHL0UsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUFvQixLQUFpQixFQUFVLFVBQXdCO1FBQW5ELFVBQUssR0FBTCxLQUFLLENBQVk7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFjO0lBQUcsQ0FBQztJQUUzRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQVcsRUFBRSxjQUFzQixFQUFFO1FBQzlDLE1BQU0sWUFBWSxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEYsSUFBSSxRQUFRLEdBQVcsWUFBWSxDQUFDO1FBQ3BDLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzlCLFFBQVEsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDeEM7UUFFRCxNQUFNLFFBQVEsR0FBeUIsTUFBTSxJQUFJLENBQUMsS0FBSzthQUNwRCxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7YUFDNUUsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLFdBQVcsR0FBVyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUMvRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDdEI7YUFBTTtZQUNMLE1BQU0sS0FBSyxDQUFDLEdBQUcsV0FBVyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQzs7b0lBbkJVLHVCQUF1QjsrSEFBdkIsdUJBQXVCLFdBQXZCLHVCQUF1Qjt1RkFBdkIsdUJBQXVCO2NBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBTZWN1cml0eUNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaXNHaXRodWJIcmVmLCByYXdHaXRodWJIcmVmIH0gZnJvbSAnLi4vbWFya2Rvd24tdXRpbHMvbWFya2Rvd24tdXRpbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGRNYXJrZG93bkxvYWRlclNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBhc3luYyBsb2FkKHVybDogc3RyaW5nLCBodHRwT3B0aW9uczogb2JqZWN0ID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHNhbml0aXplZFVybDogc3RyaW5nID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5VUkwsIHVybCk7XG4gICAgbGV0IHVybFRvR2V0OiBzdHJpbmcgPSBzYW5pdGl6ZWRVcmw7XG4gICAgaWYgKGlzR2l0aHViSHJlZihzYW5pdGl6ZWRVcmwpKSB7XG4gICAgICB1cmxUb0dldCA9IHJhd0dpdGh1YkhyZWYoc2FuaXRpemVkVXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZTogSHR0cFJlc3BvbnNlPHN0cmluZz4gPSBhd2FpdCB0aGlzLl9odHRwXG4gICAgICAuZ2V0KHVybFRvR2V0LCB7IC4uLmh0dHBPcHRpb25zLCByZXNwb25zZVR5cGU6ICd0ZXh0Jywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgaWYgKGNvbnRlbnRUeXBlLmluY2x1ZGVzKCd0ZXh0L3BsYWluJykgfHwgY29udGVudFR5cGUuaW5jbHVkZXMoJ3RleHQvbWFya2Rvd24nKSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKGAke2NvbnRlbnRUeXBlfSBpcyBub3QgYSBoYW5kbGVkIGNvbnRlbnQgdHlwZWApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,115 +0,0 @@
1
- export function removeLeadingHash(str) {
2
- if (str) {
3
- return str.replace(/^#+/, '');
4
- }
5
- return '';
6
- }
7
- export function removeTrailingHash(str) {
8
- if (str) {
9
- return str.replace(/\#.*/, '');
10
- }
11
- return '';
12
- }
13
- export function genHeadingId(str) {
14
- if (str) {
15
- return removeLeadingHash(str
16
- .replace(/(_|-|\s)+/g, '')
17
- // Remove certain special chars to create heading ids similar to those in github
18
- // borrowed from showdown
19
- // https://github.com/showdownjs/showdown/blob/develop/src/subParsers/makehtml/headers.js#L94
20
- .replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g, '')).toLowerCase();
21
- }
22
- return '';
23
- }
24
- export function scrollToAnchor(scope, anchor, tryParent) {
25
- if (scope && anchor) {
26
- const normalizedAnchor = genHeadingId(anchor);
27
- let headingToJumpTo;
28
- const headingWithinComponent = scope.querySelector(`[id="${normalizedAnchor}"]`);
29
- if (headingWithinComponent) {
30
- headingToJumpTo = headingWithinComponent;
31
- }
32
- else if (tryParent) {
33
- const parent = scope.parentElement;
34
- if (parent) {
35
- headingToJumpTo = parent.querySelector(`[id="${normalizedAnchor}"]`);
36
- }
37
- }
38
- if (headingToJumpTo) {
39
- headingToJumpTo.scrollIntoView({ behavior: 'auto' });
40
- return true;
41
- }
42
- }
43
- return false;
44
- }
45
- export function isAnchorLink(anchor) {
46
- if (anchor) {
47
- const href = anchor.getAttribute('href');
48
- if (href) {
49
- return href.startsWith('#');
50
- }
51
- }
52
- return false;
53
- }
54
- const RAW_GITHUB_HOSTNAME = 'raw.githubusercontent.com';
55
- export function rawGithubHref(githubHref) {
56
- if (githubHref) {
57
- try {
58
- const url = new URL(githubHref);
59
- if (url.hostname === RAW_GITHUB_HOSTNAME) {
60
- return url.href;
61
- }
62
- else if (isGithubHref(githubHref)) {
63
- url.hostname = RAW_GITHUB_HOSTNAME;
64
- url.pathname = url.pathname.split('/blob', 2).join('');
65
- return url.href;
66
- }
67
- }
68
- catch {
69
- return '';
70
- }
71
- }
72
- return '';
73
- }
74
- export function isGithubHref(href) {
75
- try {
76
- const temp = new URL(href);
77
- return temp.hostname === 'github.com';
78
- }
79
- catch {
80
- return false;
81
- }
82
- }
83
- export function isRawGithubHref(href) {
84
- try {
85
- const temp = new URL(href);
86
- return temp.hostname === RAW_GITHUB_HOSTNAME;
87
- }
88
- catch {
89
- return false;
90
- }
91
- }
92
- export function renderVideoElements(html) {
93
- const ytLongEmbed = /!\[(?:(?:https?:)?(?:\/\/)?)(?:(?:www)?.)?youtube.(?:.+?)\/(?:(?:embed\/)([\w-]{11})(\?[\w%;-]+(?:=[\w%;-]+)?(?:&[\w%;-]+(?:=[\w%;-]+)?)*)?)]/gi;
94
- const ytLongWatch = /!\[(?:(?:https?:)?(?:\/\/)?)(?:(?:www)?.)?youtube.(?:.+?)\/(?:(?:watch\?v=)([\w-]{11})(&[\w%;-]+(?:=[\w%;-]+)?)*)]/gi;
95
- const ytShort = /!\[(?:(?:https?:)?(?:\/\/)?)?youtu.be\/([\w-]{11})\??([\w%;-]+(?:=[\w%;-]+)?(?:&[\w%;-]+(?:=[\w%;-]+)?)*)?]/gi;
96
- const ytPlaylist = /!\[(?:(?:https?:)?(?:\/\/)?)(?:(?:www)?.)?youtube.(?:.+?)\/(?:(?:playlist\?list=)([\w-]{34})(&[\w%;-]+(?:=[\w%;-]+)?)*)]/gi;
97
- function convert(match, id, flags) {
98
- if (flags) {
99
- id += '?' + flags.replace(/&amp;/gi, '&');
100
- }
101
- return `<iframe allow="fullscreen" frameborder="0" src="https://www.youtube.com/embed/${id}"></iframe>`;
102
- }
103
- function convertPL(match, id, flags) {
104
- if (flags) {
105
- id += flags.replace(/&amp;/gi, '&');
106
- }
107
- return `<iframe allow="fullscreen" frameborder="0" src="https://www.youtube.com/embed/videoseries?list=${id}"></iframe>`;
108
- }
109
- return html
110
- .replace(ytLongWatch, convert)
111
- .replace(ytLongEmbed, convert)
112
- .replace(ytShort, convert)
113
- .replace(ytPlaylist, convertPL);
114
- }
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcGxhdGZvcm0vbWFya2Rvd24vbWFya2Rvd24tdXRpbHMvbWFya2Rvd24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQVc7SUFDM0MsSUFBSSxHQUFHLEVBQUU7UUFDUCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsSUFBSSxHQUFHLEVBQUU7UUFDUCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLElBQUksR0FBRyxFQUFFO1FBQ1AsT0FBTyxpQkFBaUIsQ0FDdEIsR0FBRzthQUNBLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQzFCLGdGQUFnRjtZQUNoRix5QkFBeUI7WUFDekIsNkZBQTZGO2FBQzVGLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxFQUFFLENBQUMsQ0FDekQsQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNqQjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBa0IsRUFBRSxNQUFjLEVBQUUsU0FBa0I7SUFDbkYsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFO1FBQ25CLE1BQU0sZ0JBQWdCLEdBQVcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksZUFBNEIsQ0FBQztRQUNqQyxNQUFNLHNCQUFzQixHQUFnQixLQUFLLENBQUMsYUFBYSxDQUFD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LE9BQU8saUZBQWlGLEVBQUUsYUFBYSxDQUFDO0lBQzFHLENBQUM7SUFDRCxTQUFTLFNBQVMsQ0FBQyxLQUFhLEVBQUUsRUFBVSxFQUFFLEtBQWE7UUFDekQsSUFBSSxLQUFLLEVBQUU7WUFDVCxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLGtHQUFrRyxFQUFFLGFBQWEsQ0FBQztJQUMzSCxDQUFDO0lBRUQsT0FBTyxJQUFJO1NBQ1IsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7U0FDN0IsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7U0FDN0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7U0FDekIsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxlYWRpbmdIYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXiMrLywgJycpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRyYWlsaW5nSGFzaChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcIy4qLywgJycpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbkhlYWRpbmdJZChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdHIpIHtcbiAgICByZXR1cm4gcmVtb3ZlTGVhZGluZ0hhc2goXG4gICAgICBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhffC18XFxzKSsvZywgJycpXG4gICAgICAgIC8vIFJlbW92ZSBjZXJ0YWluIHNwZWNpYWwgY2hhcnMgdG8gY3JlYXRlIGhlYWRpbmcgaWRzIHNpbWlsYXIgdG8gdGhvc2UgaW4gZ2l0aHViXG4gICAgICAgIC8vIGJvcnJvd2VkIGZyb20gc2hvd2Rvd25cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Nob3dkb3duanMvc2hvd2Rvd24vYmxvYi9kZXZlbG9wL3NyYy9zdWJQYXJzZXJzL21ha2VodG1sL2hlYWRlcnMuanMjTDk0XG4gICAgICAgIC5yZXBsYWNlKC9bJiskLFxcLzo7PT9AXCIje318XsKoflxcW1xcXWBcXFxcKikoJS4hJzw+XS9nLCAnJyksXG4gICAgKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbFRvQW5jaG9yKHNjb3BlOiBIVE1MRWxlbWVudCwgYW5jaG9yOiBzdHJpbmcsIHRyeVBhcmVudDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBpZiAoc2NvcGUgJiYgYW5jaG9yKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFuY2hvcjogc3RyaW5nID0gZ2VuSGVhZGluZ0lkKGFuY2hvcik7XG4gICAgbGV0IGhlYWRpbmdUb0p1bXBUbzogSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgaGVhZGluZ1dpdGhpbkNvbXBvbmVudDogSFRNTEVsZW1lbnQgPSBzY29wZS5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke25vcm1hbGl6ZWRBbmNob3J9XCJdYCk7XG5cbiAgICBpZiAoaGVhZGluZ1dpdGhpbkNvbXBvbmVudCkge1xuICAgICAgaGVhZGluZ1RvSnVtcFRvID0gaGVhZGluZ1dpdGhpbkNvbXBvbmVudDtcbiAgICB9IGVsc2UgaWYgKHRyeVBhcmVudCkge1xuICAgICAgY29uc3QgcGFyZW50OiBIVE1MRWxlbWVudCA9IHNjb3BlLnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGhlYWRpbmdUb0p1bXBUbyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke25vcm1hbGl6ZWRBbmNob3J9XCJdYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoZWFkaW5nVG9KdW1wVG8pIHtcbiAgICAgIGhlYWRpbmdUb0p1bXBUby5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnYXV0bycgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQpOiBib29sZWFuIHtcbiAgaWYgKGFuY2hvcikge1xuICAgIGNvbnN0IGhyZWY6IHN0cmluZyA9IGFuY2hvci5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBpZiAoaHJlZikge1xuICAgICAgcmV0dXJuIGhyZWYuc3RhcnRzV2l0aCgnIycpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBSQVdfR0lUSFVCX0hPU1ROQU1FOiBzdHJpbmcgPSAncmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByYXdHaXRodWJIcmVmKGdpdGh1YkhyZWY6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChnaXRodWJIcmVmKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybDogVVJMID0gbmV3IFVSTChnaXRodWJIcmVmKTtcbiAgICAgIGlmICh1cmwuaG9zdG5hbWUgPT09IFJBV19HSVRIVUJfSE9TVE5BTUUpIHtcbiAgICAgICAgcmV0dXJuIHVybC5ocmVmO1xuICAgICAgfSBlbHNlIGlmIChpc0dpdGh1YkhyZWYoZ2l0aHViSHJlZikpIHtcbiAgICAgICAgdXJsLmhvc3RuYW1lID0gUkFXX0dJVEhVQl9IT1NUTkFNRTtcbiAgICAgICAgdXJsLnBhdGhuYW1lID0gdXJsLnBhdGhuYW1lLnNwbGl0KCcvYmxvYicsIDIpLmpvaW4oJycpO1xuICAgICAgICByZXR1cm4gdXJsLmhyZWY7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0aHViSHJlZihocmVmOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0ZW1wOiBVUkwgPSBuZXcgVVJMKGhyZWYpO1xuICAgIHJldHVybiB0ZW1wLmhvc3RuYW1lID09PSAnZ2l0aHViLmNvbSc7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSYXdHaXRodWJIcmVmKGhyZWY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRlbXA6IFVSTCA9IG5ldyBVUkwoaHJlZik7XG4gICAgcmV0dXJuIHRlbXAuaG9zdG5hbWUgPT09IFJBV19HSVRIVUJfSE9TVE5BTUU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVmlkZW9FbGVtZW50cyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB5dExvbmdFbWJlZDogUmVnRXhwID1cbiAgICAvIVxcWyg/Oig/Omh0dHBzPzopPyg/OlxcL1xcLyk/KSg/Oig/Ond3dyk/Lik/eW91dHViZS4oPzouKz8pXFwvKD86KD86ZW1iZWRcXC8pKFtcXHctXXsxMX0pKFxcP1tcXHclOy1dKyg/Oj1bXFx3JTstXSspPyg/OiZbXFx3JTstXSsoPzo9W1xcdyU7LV0rKT8pKik/KV0vZ2k7XG4gIGNvbnN0IHl0TG9uZ1dhdGNoOiBSZWdFeHAgPVxuICAgIC8hXFxbKD86KD86aHR0cHM/Oik/KD86XFwvXFwvKT8pKD86KD86d3d3KT8uKT95b3V0dWJlLig/Oi4rPylcXC8oPzooPzp3YXRjaFxcP3Y9KShbXFx3LV17MTF9KSgmW1xcdyU7LV0rKD86PVtcXHclOy1dKyk/KSopXS9naTtcbiAgY29uc3QgeXRTaG9ydDogUmVnRXhwID1cbiAgICAvIVxcWyg/Oig/Omh0dHBzPzopPyg/OlxcL1xcLyk/KT95b3V0dS5iZVxcLyhbXFx3LV17MTF9KVxcPz8oW1xcdyU7LV0rKD86PVtcXHclOy1dKyk/KD86JltcXHclOy1dKyg/Oj1bXFx3JTstXSspPykqKT9dL2dpO1xuICBjb25zdCB5dFBsYXlsaXN0OiBSZWdFeHAgPVxuICAgIC8hXFxbKD86KD86aHR0cHM/Oik/KD86XFwvXFwvKT8pKD86KD86d3d3KT8uKT95b3V0dWJlLig/Oi4rPylcXC8oPzooPzpwbGF5bGlzdFxcP2xpc3Q9KShbXFx3LV17MzR9KSgmW1xcdyU7LV0rKD86PVtcXHclOy1dKyk/KSopXS9naTtcblxuICBmdW5jdGlvbiBjb252ZXJ0KG1hdGNoOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmbGFncykge1xuICAgICAgaWQgKz0gJz8nICsgZmxhZ3MucmVwbGFjZSgvJmFtcDsvZ2ksICcmJyk7XG4gICAgfVxuICAgIHJldHVybiBgPGlmcmFtZSBhbGxvdz1cImZ1bGxzY3JlZW5cIiBmcmFtZWJvcmRlcj1cIjBcIiBzcmM9XCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke2lkfVwiPjwvaWZyYW1lPmA7XG4gIH1cbiAgZnVuY3Rpb24gY29udmVydFBMKG1hdGNoOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmbGFncykge1xuICAgICAgaWQgKz0gZmxhZ3MucmVwbGFjZSgvJmFtcDsvZ2ksICcmJyk7XG4gICAgfVxuICAgIHJldHVybiBgPGlmcmFtZSBhbGxvdz1cImZ1bGxzY3JlZW5cIiBmcmFtZWJvcmRlcj1cIjBcIiBzcmM9XCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC92aWRlb3Nlcmllcz9saXN0PSR7aWR9XCI+PC9pZnJhbWU+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sXG4gICAgLnJlcGxhY2UoeXRMb25nV2F0Y2gsIGNvbnZlcnQpXG4gICAgLnJlcGxhY2UoeXRMb25nRW1iZWQsIGNvbnZlcnQpXG4gICAgLnJlcGxhY2UoeXRTaG9ydCwgY29udmVydClcbiAgICAucmVwbGFjZSh5dFBsYXlsaXN0LCBjb252ZXJ0UEwpO1xufVxuIl19