@visuno/angular 0.0.0-stage → 0.1.0
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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,1755 @@
|
|
|
1
|
+
// framework/angular/rich-text-editor/rich-text-editor.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/rich-text-editor/RichTextEditor.tsx
|
|
4
|
+
// (engine from framework/vanilla/rich-text-editor/rich-text-editor.js).
|
|
5
|
+
//
|
|
6
|
+
// A minimal editor for a draft an agent helps with: a formatting toolbar, a
|
|
7
|
+
// native contenteditable body, and a quiet foot with the word count and undo.
|
|
8
|
+
// Select text and press Ask AI (or Mod+J, or type / on a new line), and a
|
|
9
|
+
// suggestion streams in beside the text — the old words struck through, the new
|
|
10
|
+
// ones arriving word by word — to accept with Tab/Enter or discard with Escape.
|
|
11
|
+
//
|
|
12
|
+
// The editing engine is ported verbatim from the React `createEngine` into the
|
|
13
|
+
// `RteEngine` class below; the component drives a native contenteditable div via
|
|
14
|
+
// @ViewChild/ElementRef exactly as the React code drives its `ed` ref. Setup in
|
|
15
|
+
// ngAfterViewInit, cleanup in ngOnDestroy. Reduced motion via ReducedMotionService.
|
|
16
|
+
//
|
|
17
|
+
// Icon substitutions (the shared Angular icon set has no heading/bold/italic/
|
|
18
|
+
// code/link/list/quote/wand glyphs, so the closest available are used):
|
|
19
|
+
// heading -> file-text bold -> edit italic -> pr code -> term
|
|
20
|
+
// link -> ext bulleted list -> more numbered list -> more
|
|
21
|
+
// quote -> comment wand (Improve) -> spark
|
|
22
|
+
// The remaining icons (spark, minus, check, edit, undo, redo, trash) map 1:1.
|
|
23
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
24
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
25
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
26
|
+
import * as i0 from "@angular/core";
|
|
27
|
+
const LEAF = 'p,h2,blockquote,li';
|
|
28
|
+
const BLOCK = /^(P|DIV|H[1-6]|LI|BLOCKQUOTE|PRE|TR|DT|DD|SECTION|ARTICLE|HEADER|FOOTER|ASIDE|MAIN|NAV|FIGURE|FIGCAPTION|UL|OL|DL|TABLE|TBODY|THEAD|TFOOT|ADDRESS|HR)$/;
|
|
29
|
+
const SKIP = /^(SCRIPT|STYLE|TEMPLATE|HEAD|META|LINK|TITLE|IFRAME|OBJECT|EMBED|SVG|MATH|IMG|PICTURE|VIDEO|AUDIO|CANVAS|NOSCRIPT|BUTTON|INPUT|SELECT|TEXTAREA|OPTION)$/;
|
|
30
|
+
const isMac = () => typeof navigator !== 'undefined' && /Mac|iP(hone|ad|od)/.test(navigator.platform || navigator.userAgent);
|
|
31
|
+
const safeUrl = (h) => { const v = (h || '').trim(); return /^(https?:\/\/|mailto:)/i.test(v) ? v : null; };
|
|
32
|
+
/* ---------- the editing engine ----------
|
|
33
|
+
The text is a list of lines (paragraphs, a heading, list items and quote lines) holding bold, italic, inline code and links,
|
|
34
|
+
and every change goes through it: Enter, Backspace at a line's start, formats, paste and drop, so pasted or browser-made
|
|
35
|
+
markup is cleaned into those few tags. Undo and redo step through its own history. A selection is kept as two numbers, the
|
|
36
|
+
characters before each end with a line break counting one, so it survives every rebuild, and the editor works the same with
|
|
37
|
+
or without the focus (a story types into it without taking the focus from the page). Ported verbatim from the React engine. */
|
|
38
|
+
class RteEngine {
|
|
39
|
+
constructor(ed, hook) {
|
|
40
|
+
this.offs = [];
|
|
41
|
+
this.caret = null;
|
|
42
|
+
this.pend = null;
|
|
43
|
+
this.rev = null;
|
|
44
|
+
this.H = { list: [], at: 0, dirty: false, pre: null, t: 0 };
|
|
45
|
+
this.ed = ed;
|
|
46
|
+
this.hook = hook;
|
|
47
|
+
const on = (el, ev, fn) => { el.addEventListener(ev, fn); this.offs.push(() => el.removeEventListener(ev, fn)); };
|
|
48
|
+
on(ed, 'beforeinput', (e) => this.onBeforeInput(e));
|
|
49
|
+
on(ed, 'input', ((e) => { if (this.rev)
|
|
50
|
+
return; if (this.messy())
|
|
51
|
+
this.clean(); this.typed(this.H.pre); this.hook.input?.(e); }));
|
|
52
|
+
on(ed, 'paste', (e) => {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
if (this.rev || !e.clipboardData)
|
|
55
|
+
return;
|
|
56
|
+
const h = e.clipboardData.getData('text/html'), s = e.clipboardData.getData('text/plain');
|
|
57
|
+
let items = h ? this.parse(new DOMParser().parseFromString(h, 'text/html').body, false) : [];
|
|
58
|
+
if (!items.length)
|
|
59
|
+
items = this.plain(s);
|
|
60
|
+
if (!items.length)
|
|
61
|
+
return;
|
|
62
|
+
this.flush();
|
|
63
|
+
const o = this.get(), at = this.insertLines(items, o);
|
|
64
|
+
this.set({ s: at, e: at });
|
|
65
|
+
this.commit(o);
|
|
66
|
+
});
|
|
67
|
+
on(ed, 'cut', (e) => {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
if (this.rev || !e.clipboardData)
|
|
70
|
+
return;
|
|
71
|
+
const o = this.get();
|
|
72
|
+
if (o.s === o.e)
|
|
73
|
+
return;
|
|
74
|
+
const g = this.live();
|
|
75
|
+
e.clipboardData.setData('text/plain', this.text(o));
|
|
76
|
+
if (g) {
|
|
77
|
+
const d = document.createElement('div');
|
|
78
|
+
d.appendChild(g.cloneContents());
|
|
79
|
+
e.clipboardData.setData('text/html', d.innerHTML);
|
|
80
|
+
}
|
|
81
|
+
this.flush();
|
|
82
|
+
const p = this.del(o);
|
|
83
|
+
this.set(p);
|
|
84
|
+
this.commit(o);
|
|
85
|
+
});
|
|
86
|
+
on(ed, 'dragstart', (e) => e.preventDefault());
|
|
87
|
+
on(ed, 'drop', (e) => this.onDrop(e));
|
|
88
|
+
on(ed, 'keydown', (e) => this.onKeyDown(e));
|
|
89
|
+
on(document, 'selectionchange', () => {
|
|
90
|
+
if (!this.live() || this.rev)
|
|
91
|
+
return;
|
|
92
|
+
this.caret = this.get();
|
|
93
|
+
if (this.pend && (this.caret.s !== this.pend.at || this.caret.e !== this.pend.at))
|
|
94
|
+
this.pend = null;
|
|
95
|
+
this.hook.select?.();
|
|
96
|
+
});
|
|
97
|
+
this.tidy();
|
|
98
|
+
this.H.list = [{ html: ed.innerHTML, sel: { s: 0, e: 0 }, pre: null }];
|
|
99
|
+
}
|
|
100
|
+
// ---- lines and offsets ----
|
|
101
|
+
lines() { return [...this.ed.querySelectorAll(LEAF)]; }
|
|
102
|
+
typeOf(b) { return b.tagName === 'LI' ? b.parentNode.tagName.toLowerCase() : b.tagName === 'BLOCKQUOTE' ? 'quote' : b.tagName.toLowerCase(); }
|
|
103
|
+
lineOf(n) { for (let x = n; x && x !== this.ed; x = x.parentNode)
|
|
104
|
+
if (x.nodeType === 1 && x.matches(LEAF))
|
|
105
|
+
return x; return null; }
|
|
106
|
+
len(b) { return (b.textContent || '').length; }
|
|
107
|
+
total() { return this.lines().reduce((n, b, i) => n + this.len(b) + (i ? 1 : 0), 0); }
|
|
108
|
+
startOf(i) { return this.lines().slice(0, i).reduce((n, b) => n + this.len(b) + 1, 0); }
|
|
109
|
+
lineAt(at) { const all = this.lines(); let n = 0; for (let i = 0; i < all.length; i++) {
|
|
110
|
+
if (at <= n + this.len(all[i]))
|
|
111
|
+
return i;
|
|
112
|
+
n += this.len(all[i]) + 1;
|
|
113
|
+
} return all.length - 1; }
|
|
114
|
+
text(o) { return this.lines().map(b => b.textContent).join('\n').slice(o.s, o.e); }
|
|
115
|
+
up(n, tag) { for (let x = n && n.nodeType === 3 ? n.parentNode : n; x && x !== this.ed && x.nodeType === 1 && !x.matches(LEAF); x = x.parentNode)
|
|
116
|
+
if (x.tagName === tag)
|
|
117
|
+
return x; return null; }
|
|
118
|
+
wrap(n, tag, href) { const w = document.createElement(tag.toLowerCase()); if (href)
|
|
119
|
+
w.setAttribute('href', href); n.replaceWith(w); w.appendChild(n); return w; }
|
|
120
|
+
unwrap(el) { el.replaceWith(...el.childNodes); }
|
|
121
|
+
offsetOf(node, off) {
|
|
122
|
+
let b = this.lineOf(node);
|
|
123
|
+
if (!b) {
|
|
124
|
+
if (!this.ed.contains(node))
|
|
125
|
+
return 0;
|
|
126
|
+
const after = node.childNodes[off], first = after && after.nodeType === 1 ? (after.matches(LEAF) ? after : after.querySelector(LEAF)) : null;
|
|
127
|
+
if (!first)
|
|
128
|
+
return this.total();
|
|
129
|
+
b = first;
|
|
130
|
+
node = first;
|
|
131
|
+
off = 0;
|
|
132
|
+
}
|
|
133
|
+
let n = 0;
|
|
134
|
+
for (const x of this.lines()) {
|
|
135
|
+
if (x === b)
|
|
136
|
+
break;
|
|
137
|
+
n += this.len(x) + 1;
|
|
138
|
+
}
|
|
139
|
+
const rg = document.createRange();
|
|
140
|
+
rg.setStart(b, 0);
|
|
141
|
+
rg.setEnd(node, off);
|
|
142
|
+
return n + rg.toString().length;
|
|
143
|
+
}
|
|
144
|
+
pointAt(at, late = false) {
|
|
145
|
+
const all = this.lines();
|
|
146
|
+
let n = Math.max(0, at);
|
|
147
|
+
for (let i = 0; i < all.length; i++) {
|
|
148
|
+
const b = all[i];
|
|
149
|
+
if (n <= this.len(b) || i === all.length - 1) {
|
|
150
|
+
n = Math.min(n, this.len(b));
|
|
151
|
+
const w = document.createTreeWalker(b, NodeFilter.SHOW_TEXT);
|
|
152
|
+
let t, last = null;
|
|
153
|
+
while ((t = w.nextNode())) {
|
|
154
|
+
if (late ? n < t.data.length : n <= t.data.length)
|
|
155
|
+
return [t, n];
|
|
156
|
+
n -= t.data.length;
|
|
157
|
+
last = t;
|
|
158
|
+
}
|
|
159
|
+
return last ? [last, last.data.length] : [b, 0];
|
|
160
|
+
}
|
|
161
|
+
n -= this.len(b) + 1;
|
|
162
|
+
}
|
|
163
|
+
return [this.ed, 0];
|
|
164
|
+
}
|
|
165
|
+
range(o) { const [a, ao] = this.pointAt(o.s, o.s !== o.e), [b, bo] = this.pointAt(o.e); const rg = document.createRange(); rg.setStart(a, ao); rg.setEnd(b, bo); return rg; }
|
|
166
|
+
showRange(x) {
|
|
167
|
+
const r = x.getBoundingClientRect(), b = this.ed.getBoundingClientRect();
|
|
168
|
+
if (!r.height)
|
|
169
|
+
return;
|
|
170
|
+
if (r.bottom > b.bottom - 12)
|
|
171
|
+
this.ed.scrollTop += Math.min(r.bottom - b.bottom + 12, r.top - b.top - 12);
|
|
172
|
+
else if (r.top < b.top + 12)
|
|
173
|
+
this.ed.scrollTop -= b.top + 12 - r.top;
|
|
174
|
+
}
|
|
175
|
+
// ---- selection ----
|
|
176
|
+
live() { const s = getSelection(); if (!s || !s.rangeCount)
|
|
177
|
+
return null; const g = s.getRangeAt(0); return this.ed.contains(g.startContainer) && this.ed.contains(g.endContainer) ? g : null; }
|
|
178
|
+
get() {
|
|
179
|
+
const g = this.live();
|
|
180
|
+
if (g) {
|
|
181
|
+
const a = this.offsetOf(g.startContainer, g.startOffset), b = this.offsetOf(g.endContainer, g.endOffset);
|
|
182
|
+
return { s: Math.min(a, b), e: Math.max(a, b) };
|
|
183
|
+
}
|
|
184
|
+
if (!this.caret) {
|
|
185
|
+
const t = this.total();
|
|
186
|
+
this.caret = { s: t, e: t };
|
|
187
|
+
}
|
|
188
|
+
return { s: this.caret.s, e: this.caret.e };
|
|
189
|
+
}
|
|
190
|
+
set(o, focus = false) {
|
|
191
|
+
this.caret = { s: o.s, e: o.e };
|
|
192
|
+
if (focus && document.activeElement !== this.ed)
|
|
193
|
+
this.ed.focus({ preventScroll: true });
|
|
194
|
+
if (document.activeElement !== this.ed)
|
|
195
|
+
return;
|
|
196
|
+
const s = getSelection();
|
|
197
|
+
if (!s)
|
|
198
|
+
return;
|
|
199
|
+
s.removeAllRanges();
|
|
200
|
+
s.addRange(this.range(o));
|
|
201
|
+
}
|
|
202
|
+
// ---- tidying ----
|
|
203
|
+
tidy() {
|
|
204
|
+
for (const el of this.ed.querySelectorAll('b,i,code,a')) {
|
|
205
|
+
if (!el.isConnected)
|
|
206
|
+
continue;
|
|
207
|
+
if (!el.textContent) {
|
|
208
|
+
el.remove();
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (this.up(el.parentNode, el.tagName))
|
|
212
|
+
this.unwrap(el);
|
|
213
|
+
}
|
|
214
|
+
for (const el of this.ed.querySelectorAll('b,i,code,a')) {
|
|
215
|
+
if (!el.isConnected)
|
|
216
|
+
continue;
|
|
217
|
+
for (;;) {
|
|
218
|
+
let nx = el.nextSibling;
|
|
219
|
+
while (nx && nx.nodeType === 3 && !nx.data) {
|
|
220
|
+
const d = nx;
|
|
221
|
+
nx = nx.nextSibling;
|
|
222
|
+
d.remove();
|
|
223
|
+
}
|
|
224
|
+
if (!nx || nx.nodeType !== 1 || nx.tagName !== el.tagName || nx.getAttribute('href') !== el.getAttribute('href'))
|
|
225
|
+
break;
|
|
226
|
+
el.append(...nx.childNodes);
|
|
227
|
+
nx.remove();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
for (const b of this.lines()) {
|
|
231
|
+
const br = [...b.querySelectorAll('br')];
|
|
232
|
+
if (b.textContent)
|
|
233
|
+
br.forEach(x => x.remove());
|
|
234
|
+
else if (!br.length)
|
|
235
|
+
b.appendChild(document.createElement('br'));
|
|
236
|
+
else
|
|
237
|
+
br.slice(1).forEach(x => x.remove());
|
|
238
|
+
}
|
|
239
|
+
if (!this.lines().length) {
|
|
240
|
+
const p = document.createElement('p');
|
|
241
|
+
p.appendChild(document.createElement('br'));
|
|
242
|
+
this.ed.replaceChildren(p);
|
|
243
|
+
}
|
|
244
|
+
this.ed.normalize();
|
|
245
|
+
}
|
|
246
|
+
rebuild(spec) {
|
|
247
|
+
const frag = document.createDocumentFragment();
|
|
248
|
+
let list = null;
|
|
249
|
+
for (const [t, b] of spec) {
|
|
250
|
+
const el = document.createElement(t === 'quote' ? 'blockquote' : t === 'ul' || t === 'ol' ? 'li' : t);
|
|
251
|
+
el.append(...b.childNodes);
|
|
252
|
+
if (t === 'ul' || t === 'ol') {
|
|
253
|
+
if (!list || list.tagName.toLowerCase() !== t)
|
|
254
|
+
frag.appendChild(list = document.createElement(t));
|
|
255
|
+
list.appendChild(el);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
list = null;
|
|
259
|
+
frag.appendChild(el);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
this.ed.replaceChildren(frag);
|
|
263
|
+
this.tidy();
|
|
264
|
+
}
|
|
265
|
+
specOf() { return this.lines().map(b => [this.typeOf(b), b]); }
|
|
266
|
+
messy() {
|
|
267
|
+
for (const n of this.ed.childNodes) {
|
|
268
|
+
if (n.nodeType === 3 ? n.data.trim() : n.nodeType === 1 && !/^(P|H2|BLOCKQUOTE|UL|OL)$/.test(n.tagName))
|
|
269
|
+
return true;
|
|
270
|
+
if (n.nodeType === 1 && /^(UL|OL)$/.test(n.tagName) && [...n.childNodes].some(x => x.nodeType !== 1 || x.tagName !== 'LI'))
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
return !!this.ed.querySelector('[style],[class],span,font,div,a:not([href]),:is(p,h2,blockquote,li) :not(b,i,code,a,br)');
|
|
274
|
+
}
|
|
275
|
+
// ---- parse ----
|
|
276
|
+
parse(root, keep) {
|
|
277
|
+
const out = [];
|
|
278
|
+
let cur = null;
|
|
279
|
+
const walk = (node, t, pre, marks) => {
|
|
280
|
+
for (const n of node.childNodes) {
|
|
281
|
+
if (n.nodeType === 3) {
|
|
282
|
+
const d = n.data;
|
|
283
|
+
let s = keep ? d : pre ? d.replace(/\r\n?/g, '\n') : d.replace(/[\s ]+/g, ' ');
|
|
284
|
+
if (!keep)
|
|
285
|
+
s = s.replace(/ /g, ' ');
|
|
286
|
+
if (!cur && !s.trim() && (node === root || /^(UL|OL|DL|TABLE|TBODY|THEAD|TFOOT|TR)$/.test(node.tagName)))
|
|
287
|
+
continue;
|
|
288
|
+
(pre && !keep ? s.split('\n') : [s]).forEach((p, i) => {
|
|
289
|
+
if (i)
|
|
290
|
+
cur = null;
|
|
291
|
+
if (!p || (!cur && !keep && !p.trim()))
|
|
292
|
+
return;
|
|
293
|
+
if (!cur)
|
|
294
|
+
out.push(cur = { t, frag: document.createDocumentFragment() });
|
|
295
|
+
let x = document.createTextNode(p);
|
|
296
|
+
for (let m = marks.length - 1; m >= 0; m--) {
|
|
297
|
+
const w = document.createElement(marks[m][0].toLowerCase());
|
|
298
|
+
if (marks[m][1])
|
|
299
|
+
w.setAttribute('href', marks[m][1]);
|
|
300
|
+
w.appendChild(x);
|
|
301
|
+
x = w;
|
|
302
|
+
}
|
|
303
|
+
cur.frag.appendChild(x);
|
|
304
|
+
});
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
if (n.nodeType !== 1)
|
|
308
|
+
continue;
|
|
309
|
+
const el = n, tg = el.tagName;
|
|
310
|
+
if (SKIP.test(tg) || el.classList.contains('vo-rte-new'))
|
|
311
|
+
continue;
|
|
312
|
+
const css = (el.getAttribute('style') || '').toLowerCase();
|
|
313
|
+
if (tg === 'BR') {
|
|
314
|
+
cur = null;
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (BLOCK.test(tg)) {
|
|
318
|
+
const nt = /^H[1-6]$/.test(tg) ? 'h2' : tg === 'LI' ? (el.parentElement && el.parentElement.tagName === 'OL' ? 'ol' : 'ul') : tg === 'BLOCKQUOTE' ? 'quote' : t;
|
|
319
|
+
cur = null;
|
|
320
|
+
const was = out.length;
|
|
321
|
+
walk(el, nt, pre || tg === 'PRE', marks);
|
|
322
|
+
if (keep && out.length === was && !el.querySelector('p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre,ul,ol'))
|
|
323
|
+
out.push({ t: nt, frag: document.createDocumentFragment() });
|
|
324
|
+
cur = null;
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
let m = marks;
|
|
328
|
+
const add = (tag, href) => { if (!m.some(x => x[0] === tag))
|
|
329
|
+
m = [...m, [tag, href]]; };
|
|
330
|
+
if (tg === 'B' || tg === 'STRONG' ? !/font-weight\s*:\s*(normal|[1-4]00)/.test(css) : /font-weight\s*:\s*(bold|[6-9]00)/.test(css))
|
|
331
|
+
add('B');
|
|
332
|
+
if (tg === 'I' || tg === 'EM' || /font-style\s*:\s*italic/.test(css))
|
|
333
|
+
add('I');
|
|
334
|
+
if (/^(CODE|KBD|SAMP|TT)$/.test(tg))
|
|
335
|
+
add('CODE');
|
|
336
|
+
if (tg === 'A') {
|
|
337
|
+
const h = safeUrl(el.getAttribute('href'));
|
|
338
|
+
if (h)
|
|
339
|
+
add('A', h);
|
|
340
|
+
}
|
|
341
|
+
walk(el, t, pre, m);
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
walk(root, 'p', false, []);
|
|
345
|
+
if (!keep)
|
|
346
|
+
for (const x of out) {
|
|
347
|
+
const ts = [], w = document.createTreeWalker(x.frag, NodeFilter.SHOW_TEXT);
|
|
348
|
+
let t;
|
|
349
|
+
while ((t = w.nextNode()))
|
|
350
|
+
ts.push(t);
|
|
351
|
+
if (ts.length) {
|
|
352
|
+
ts[0].data = ts[0].data.replace(/^\s+/, '');
|
|
353
|
+
ts[ts.length - 1].data = ts[ts.length - 1].data.replace(/\s+$/, '');
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return out.filter(x => keep || x.frag.textContent).map(x => ({ ...x, len: (x.frag.textContent || '').length }));
|
|
357
|
+
}
|
|
358
|
+
plain(s) { return s.replace(/\r\n?/g, '\n').split('\n').filter(l => l.trim()).map(l => { const frag = document.createDocumentFragment(); frag.append(l); return { t: 'p', frag, len: l.length }; }); }
|
|
359
|
+
clean() { const o = this.get(); this.rebuild(this.parse(this.ed, true).map(x => [x.t, x.frag])); this.set(o); }
|
|
360
|
+
// ---- history ----
|
|
361
|
+
changed() { this.hook.change?.(); }
|
|
362
|
+
commit(pre) {
|
|
363
|
+
clearTimeout(this.H.t);
|
|
364
|
+
const html = this.ed.innerHTML, top = this.H.list[this.H.at], before = this.H.pre || pre || null;
|
|
365
|
+
this.H.dirty = false;
|
|
366
|
+
this.H.pre = null;
|
|
367
|
+
if (!top || top.html !== html) {
|
|
368
|
+
this.H.list.splice(this.H.at + 1);
|
|
369
|
+
this.H.list.push({ html, sel: this.get(), pre: before });
|
|
370
|
+
if (this.H.list.length > 300)
|
|
371
|
+
this.H.list.shift();
|
|
372
|
+
this.H.at = this.H.list.length - 1;
|
|
373
|
+
}
|
|
374
|
+
this.changed();
|
|
375
|
+
}
|
|
376
|
+
flush() { if (this.H.dirty)
|
|
377
|
+
this.commit(); }
|
|
378
|
+
typed(pre) { if (!this.H.dirty) {
|
|
379
|
+
this.H.pre = pre || null;
|
|
380
|
+
this.H.list.splice(this.H.at + 1);
|
|
381
|
+
} this.H.dirty = true; clearTimeout(this.H.t); this.H.t = setTimeout(() => this.commit(), 700); this.changed(); }
|
|
382
|
+
restore(html, sel) { this.ed.innerHTML = html; this.pend = null; this.set(sel || { s: 0, e: 0 }); this.changed(); }
|
|
383
|
+
undo() { this.flush(); if (this.H.at <= 0)
|
|
384
|
+
return; const cur = this.H.list[this.H.at]; this.H.at--; this.restore(this.H.list[this.H.at].html, cur.pre || this.H.list[this.H.at].sel); }
|
|
385
|
+
redo() { this.flush(); if (this.H.at >= this.H.list.length - 1)
|
|
386
|
+
return; this.H.at++; this.restore(this.H.list[this.H.at].html, this.H.list[this.H.at].sel); }
|
|
387
|
+
load(html) {
|
|
388
|
+
const t = document.createElement('template');
|
|
389
|
+
t.innerHTML = html || '';
|
|
390
|
+
this.rebuild(this.parse(t.content, false).map(x => [x.t, x.frag]));
|
|
391
|
+
this.caret = null;
|
|
392
|
+
this.pend = null;
|
|
393
|
+
this.rev = null;
|
|
394
|
+
this.H.list = [{ html: this.ed.innerHTML, sel: { s: 0, e: 0 }, pre: null }];
|
|
395
|
+
this.H.at = 0;
|
|
396
|
+
this.H.dirty = false;
|
|
397
|
+
clearTimeout(this.H.t);
|
|
398
|
+
this.changed();
|
|
399
|
+
}
|
|
400
|
+
// ---- edits ----
|
|
401
|
+
texts() { const out = []; let n = 0; this.lines().forEach((b, i) => { if (i)
|
|
402
|
+
n++; const w = document.createTreeWalker(b, NodeFilter.SHOW_TEXT); let t; while ((t = w.nextNode())) {
|
|
403
|
+
out.push([t, n]);
|
|
404
|
+
n += t.data.length;
|
|
405
|
+
} }); return out; }
|
|
406
|
+
cut(at) { for (const [t, n] of this.texts())
|
|
407
|
+
if (at > n && at < n + t.data.length) {
|
|
408
|
+
t.splitText(at - n);
|
|
409
|
+
return;
|
|
410
|
+
} }
|
|
411
|
+
covered(o) { this.cut(o.e); this.cut(o.s); return this.texts().filter(([t, n]) => t.data.length && n >= o.s && n + t.data.length <= o.e).map(x => x[0]); }
|
|
412
|
+
has(tag, o) {
|
|
413
|
+
if (o.s === o.e) {
|
|
414
|
+
if (this.pend && this.pend.at === o.s && tag in this.pend.m)
|
|
415
|
+
return this.pend.m[tag];
|
|
416
|
+
const g = this.live();
|
|
417
|
+
return !!this.up(g && g.collapsed ? g.startContainer : this.pointAt(o.s)[0], tag);
|
|
418
|
+
}
|
|
419
|
+
const ts = this.texts().filter(([t, n]) => t.data.length && n < o.e && n + t.data.length > o.s);
|
|
420
|
+
return ts.length > 0 && ts.every(([t]) => this.up(t, tag));
|
|
421
|
+
}
|
|
422
|
+
inline(tag, href, o = this.get()) {
|
|
423
|
+
if (o.s === o.e) {
|
|
424
|
+
if (tag === 'A')
|
|
425
|
+
return;
|
|
426
|
+
if (!this.pend || this.pend.at !== o.s)
|
|
427
|
+
this.pend = { at: o.s, m: {} };
|
|
428
|
+
this.pend.m[tag] = !this.has(tag, o);
|
|
429
|
+
this.changed();
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
this.flush();
|
|
433
|
+
const ts = this.covered(o);
|
|
434
|
+
if (!ts.length)
|
|
435
|
+
return;
|
|
436
|
+
const add = href !== undefined ? href !== null : !ts.every(t => this.up(t, tag));
|
|
437
|
+
if (add)
|
|
438
|
+
ts.forEach(t => { const had = this.up(t, tag); if (!had)
|
|
439
|
+
this.wrap(t, tag, href);
|
|
440
|
+
else if (href)
|
|
441
|
+
had.setAttribute('href', href); });
|
|
442
|
+
else
|
|
443
|
+
new Set(ts.map(t => this.up(t, tag))).forEach(el => {
|
|
444
|
+
if (!el)
|
|
445
|
+
return;
|
|
446
|
+
const keep = [], w = document.createTreeWalker(el, NodeFilter.SHOW_TEXT), h = el.getAttribute('href');
|
|
447
|
+
let t;
|
|
448
|
+
while ((t = w.nextNode()))
|
|
449
|
+
if (!ts.includes(t))
|
|
450
|
+
keep.push(t);
|
|
451
|
+
this.unwrap(el);
|
|
452
|
+
keep.forEach(x => this.wrap(x, tag, h));
|
|
453
|
+
});
|
|
454
|
+
this.tidy();
|
|
455
|
+
this.set(o);
|
|
456
|
+
this.commit(o);
|
|
457
|
+
}
|
|
458
|
+
typeStyled(s) {
|
|
459
|
+
const o = this.get(), m = this.pend.m;
|
|
460
|
+
this.pend = null;
|
|
461
|
+
const g = this.live(), [n, k] = g && g.collapsed ? [g.startContainer, g.startOffset] : this.pointAt(o.s);
|
|
462
|
+
const rg = document.createRange();
|
|
463
|
+
rg.setStart(n, k);
|
|
464
|
+
rg.collapse(true);
|
|
465
|
+
for (const tag of Object.keys(m))
|
|
466
|
+
if (!m[tag]) {
|
|
467
|
+
const el = this.up(rg.startContainer, tag);
|
|
468
|
+
if (!el)
|
|
469
|
+
continue;
|
|
470
|
+
const tail = document.createRange();
|
|
471
|
+
tail.setStart(rg.startContainer, rg.startOffset);
|
|
472
|
+
tail.setEndAfter(el);
|
|
473
|
+
el.after(tail.extractContents());
|
|
474
|
+
rg.setStartAfter(el);
|
|
475
|
+
rg.collapse(true);
|
|
476
|
+
}
|
|
477
|
+
let x = document.createTextNode(s);
|
|
478
|
+
for (const tag of Object.keys(m))
|
|
479
|
+
if (m[tag] && !this.up(rg.startContainer, tag)) {
|
|
480
|
+
const w = document.createElement(tag.toLowerCase());
|
|
481
|
+
w.appendChild(x);
|
|
482
|
+
x = w;
|
|
483
|
+
}
|
|
484
|
+
rg.insertNode(x);
|
|
485
|
+
this.tidy();
|
|
486
|
+
this.set({ s: o.s + s.length, e: o.s + s.length });
|
|
487
|
+
this.typed(o);
|
|
488
|
+
}
|
|
489
|
+
block(type, o = this.get()) {
|
|
490
|
+
this.flush();
|
|
491
|
+
const all = this.lines(), a = this.lineAt(o.s), z = this.lineAt(o.e);
|
|
492
|
+
const to = all.slice(a, z + 1).every(b => this.typeOf(b) === type) ? 'p' : type;
|
|
493
|
+
this.rebuild(all.map((b, i) => [i >= a && i <= z ? to : this.typeOf(b), b]));
|
|
494
|
+
this.set(o);
|
|
495
|
+
this.commit(o);
|
|
496
|
+
}
|
|
497
|
+
del(o) {
|
|
498
|
+
const all = this.lines(), i = this.lineAt(o.s), j = this.lineAt(o.e), [a, ao] = this.pointAt(o.s, true), [b, bo] = this.pointAt(o.e);
|
|
499
|
+
if (i === j) {
|
|
500
|
+
const rg = document.createRange();
|
|
501
|
+
rg.setStart(a, ao);
|
|
502
|
+
rg.setEnd(b, bo);
|
|
503
|
+
rg.deleteContents();
|
|
504
|
+
this.tidy();
|
|
505
|
+
return { s: o.s, e: o.s };
|
|
506
|
+
}
|
|
507
|
+
const head = document.createRange();
|
|
508
|
+
head.setStart(a, ao);
|
|
509
|
+
head.setEnd(all[i], all[i].childNodes.length);
|
|
510
|
+
head.deleteContents();
|
|
511
|
+
const tail = document.createRange();
|
|
512
|
+
tail.setStart(all[j], 0);
|
|
513
|
+
tail.setEnd(b, bo);
|
|
514
|
+
tail.deleteContents();
|
|
515
|
+
all[i].append(...all[j].childNodes);
|
|
516
|
+
this.rebuild(all.filter((_, k) => k <= i || k > j).map((x) => [this.typeOf(x), x]));
|
|
517
|
+
return { s: o.s, e: o.s };
|
|
518
|
+
}
|
|
519
|
+
split(o = this.get()) {
|
|
520
|
+
this.flush();
|
|
521
|
+
const pre = o;
|
|
522
|
+
if (o.s !== o.e)
|
|
523
|
+
o = this.del(o);
|
|
524
|
+
const all = this.lines(), i = this.lineAt(o.s), b = all[i], t = this.typeOf(b), spec = this.specOf(), next = t === 'h2' ? 'p' : t;
|
|
525
|
+
if (!this.len(b) && t !== 'p') {
|
|
526
|
+
spec[i][0] = 'p';
|
|
527
|
+
this.rebuild(spec);
|
|
528
|
+
this.set(o);
|
|
529
|
+
this.commit(pre);
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
if (this.len(b) && o.s === this.startOf(i)) {
|
|
533
|
+
spec.splice(i, 0, [next, document.createElement('p')]);
|
|
534
|
+
this.rebuild(spec);
|
|
535
|
+
this.set({ s: o.s + 1, e: o.s + 1 });
|
|
536
|
+
this.commit(pre);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
const [n, k] = this.pointAt(o.s), rg = document.createRange();
|
|
540
|
+
rg.setStart(n, k);
|
|
541
|
+
rg.setEnd(b, b.childNodes.length);
|
|
542
|
+
const nb = document.createElement('p');
|
|
543
|
+
nb.appendChild(rg.extractContents());
|
|
544
|
+
spec.splice(i + 1, 0, [next, nb]);
|
|
545
|
+
this.rebuild(spec);
|
|
546
|
+
this.set({ s: o.s + 1, e: o.s + 1 });
|
|
547
|
+
this.commit(pre);
|
|
548
|
+
}
|
|
549
|
+
joinBack(o) {
|
|
550
|
+
const all = this.lines(), i = this.lineAt(o.s), spec = this.specOf();
|
|
551
|
+
if (spec[i][0] !== 'p') {
|
|
552
|
+
spec[i][0] = 'p';
|
|
553
|
+
this.rebuild(spec);
|
|
554
|
+
this.set(o);
|
|
555
|
+
this.commit(o);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
if (!i)
|
|
559
|
+
return;
|
|
560
|
+
all[i - 1].append(...all[i].childNodes);
|
|
561
|
+
spec.splice(i, 1);
|
|
562
|
+
this.rebuild(spec);
|
|
563
|
+
this.set({ s: o.s - 1, e: o.s - 1 });
|
|
564
|
+
this.commit(o);
|
|
565
|
+
}
|
|
566
|
+
joinNext(o) {
|
|
567
|
+
const all = this.lines(), i = this.lineAt(o.s), spec = this.specOf();
|
|
568
|
+
if (i >= all.length - 1)
|
|
569
|
+
return;
|
|
570
|
+
all[i].append(...all[i + 1].childNodes);
|
|
571
|
+
spec.splice(i + 1, 1);
|
|
572
|
+
this.rebuild(spec);
|
|
573
|
+
this.set(o);
|
|
574
|
+
this.commit(o);
|
|
575
|
+
}
|
|
576
|
+
insert(s, o) {
|
|
577
|
+
const [n, k] = this.pointAt(o.s);
|
|
578
|
+
if (n.nodeType === 3)
|
|
579
|
+
n.insertData(k, s);
|
|
580
|
+
else
|
|
581
|
+
n.insertBefore(document.createTextNode(s), n.childNodes[k] || null);
|
|
582
|
+
this.tidy();
|
|
583
|
+
return o.s + s.length;
|
|
584
|
+
}
|
|
585
|
+
insertLines(items, o) {
|
|
586
|
+
if (!items.length)
|
|
587
|
+
return o.s;
|
|
588
|
+
if (o.s !== o.e)
|
|
589
|
+
o = this.del(o);
|
|
590
|
+
const all = this.lines(), i = this.lineAt(o.s), b = all[i], [n, k] = this.pointAt(o.s), spec = this.specOf();
|
|
591
|
+
const rg = document.createRange();
|
|
592
|
+
rg.setStart(n, k);
|
|
593
|
+
rg.setEnd(b, b.childNodes.length);
|
|
594
|
+
const tail = rg.extractContents();
|
|
595
|
+
if (!b.textContent && items[0].t !== 'p')
|
|
596
|
+
spec[i][0] = items[0].t;
|
|
597
|
+
let at = o.s + items[0].len;
|
|
598
|
+
b.append(items[0].frag);
|
|
599
|
+
const rest = items.slice(1).map((x) => { const p = document.createElement('p'); p.append(x.frag); at += 1 + x.len; return [x.t, p]; });
|
|
600
|
+
spec.splice(i + 1, 0, ...rest);
|
|
601
|
+
(rest.length ? rest[rest.length - 1][1] : b).append(tail);
|
|
602
|
+
this.rebuild(spec);
|
|
603
|
+
return at;
|
|
604
|
+
}
|
|
605
|
+
link(o, href) {
|
|
606
|
+
this.flush();
|
|
607
|
+
if (!href) {
|
|
608
|
+
const rg = this.range(o);
|
|
609
|
+
[...this.ed.querySelectorAll('a')].filter(a => rg.intersectsNode(a)).forEach(a => this.unwrap(a));
|
|
610
|
+
this.tidy();
|
|
611
|
+
this.set(o);
|
|
612
|
+
this.commit(o);
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
if (o.s !== o.e)
|
|
616
|
+
return this.inline('A', href, o);
|
|
617
|
+
const a = this.up(this.pointAt(o.s)[0], 'A');
|
|
618
|
+
if (a) {
|
|
619
|
+
a.setAttribute('href', href);
|
|
620
|
+
this.set(o);
|
|
621
|
+
this.commit(o);
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const label = href.replace(/^mailto:/i, ''), end = this.insert(label, o);
|
|
625
|
+
this.covered({ s: o.s, e: end }).forEach(t => this.wrap(t, 'A', href));
|
|
626
|
+
this.tidy();
|
|
627
|
+
this.set({ s: end, e: end });
|
|
628
|
+
this.commit(o);
|
|
629
|
+
}
|
|
630
|
+
// ---- suggestion ----
|
|
631
|
+
suggest(o, kind) {
|
|
632
|
+
this.flush();
|
|
633
|
+
this.pend = null;
|
|
634
|
+
const nw = document.createElement('span');
|
|
635
|
+
nw.className = 'vo-rte-new';
|
|
636
|
+
nw.contentEditable = 'false';
|
|
637
|
+
const olds = [];
|
|
638
|
+
if (kind === 'swap') {
|
|
639
|
+
const all = this.lines(), a = this.lineAt(o.s), z = this.lineAt(o.e);
|
|
640
|
+
for (let i = z; i >= a; i--) {
|
|
641
|
+
const s = Math.max(o.s, this.startOf(i)), e = Math.min(o.e, this.startOf(i) + this.len(all[i]));
|
|
642
|
+
if (e <= s)
|
|
643
|
+
continue;
|
|
644
|
+
const rg = this.range({ s, e }), sp = document.createElement('span');
|
|
645
|
+
sp.className = 'vo-rte-old';
|
|
646
|
+
sp.appendChild(rg.extractContents());
|
|
647
|
+
rg.insertNode(sp);
|
|
648
|
+
olds.unshift(sp);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
if (olds.length)
|
|
652
|
+
olds[olds.length - 1].after(nw);
|
|
653
|
+
else
|
|
654
|
+
this.range({ s: o.e, e: o.e }).insertNode(nw);
|
|
655
|
+
this.rev = { o, kind, olds, nw };
|
|
656
|
+
return (s) => { if (this.rev && this.rev.nw === nw) {
|
|
657
|
+
const w = document.createElement('span');
|
|
658
|
+
w.className = 'vo-w';
|
|
659
|
+
w.textContent = s;
|
|
660
|
+
nw.appendChild(w);
|
|
661
|
+
this.showRange(w);
|
|
662
|
+
} };
|
|
663
|
+
}
|
|
664
|
+
drop() { if (!this.rev)
|
|
665
|
+
return null; const r = this.rev; r.olds.forEach(x => this.unwrap(x)); r.nw.remove(); this.rev = null; this.tidy(); return r; }
|
|
666
|
+
accept() {
|
|
667
|
+
const s = this.rev ? this.rev.nw.textContent || '' : '';
|
|
668
|
+
const r = this.drop();
|
|
669
|
+
if (!r)
|
|
670
|
+
return;
|
|
671
|
+
const items = s.split(/\n+/).filter(Boolean).map(l => { const frag = document.createDocumentFragment(); frag.append(l); return { t: 'p', frag, len: l.length }; });
|
|
672
|
+
const at = this.insertLines(items, r.kind === 'swap' ? r.o : { s: r.o.e, e: r.o.e });
|
|
673
|
+
this.set({ s: at, e: at });
|
|
674
|
+
this.commit(r.o);
|
|
675
|
+
}
|
|
676
|
+
discard() { const r = this.drop(); if (r)
|
|
677
|
+
this.set(r.o); this.changed(); }
|
|
678
|
+
newText() { return this.rev ? this.rev.nw.textContent || '' : ''; }
|
|
679
|
+
// ---- browser events, routed through the edits ----
|
|
680
|
+
onBeforeInput(e) {
|
|
681
|
+
const t = e.inputType;
|
|
682
|
+
if (this.rev) {
|
|
683
|
+
e.preventDefault();
|
|
684
|
+
return;
|
|
685
|
+
}
|
|
686
|
+
if (t === 'historyUndo' || t === 'historyRedo') {
|
|
687
|
+
e.preventDefault();
|
|
688
|
+
if (t === 'historyUndo')
|
|
689
|
+
this.undo();
|
|
690
|
+
else
|
|
691
|
+
this.redo();
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
if (t.startsWith('format')) {
|
|
695
|
+
e.preventDefault();
|
|
696
|
+
if (t === 'formatBold')
|
|
697
|
+
this.inline('B');
|
|
698
|
+
else if (t === 'formatItalic')
|
|
699
|
+
this.inline('I');
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
if (t === 'insertParagraph' || t === 'insertLineBreak') {
|
|
703
|
+
e.preventDefault();
|
|
704
|
+
this.split();
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
if (t === 'insertFromPaste' || t === 'insertFromDrop' || t === 'deleteByDrag' || t === 'deleteByCut')
|
|
708
|
+
return;
|
|
709
|
+
const o = this.get(), i = this.lineAt(o.s);
|
|
710
|
+
if (t === 'insertText' && e.data && this.pend && o.s === o.e && this.pend.at === o.s) {
|
|
711
|
+
e.preventDefault();
|
|
712
|
+
this.typeStyled(e.data);
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
if (o.s === o.e && /^delete.*Backward$/.test(t) && o.s === this.startOf(i)) {
|
|
716
|
+
e.preventDefault();
|
|
717
|
+
this.flush();
|
|
718
|
+
this.joinBack(o);
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
if (o.s === o.e && /^delete.*Forward$/.test(t) && o.s === this.startOf(i) + this.len(this.lines()[i])) {
|
|
722
|
+
e.preventDefault();
|
|
723
|
+
this.flush();
|
|
724
|
+
this.joinNext(o);
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
if (o.s !== o.e && i !== this.lineAt(o.e) && (t.startsWith('delete') || t === 'insertText' || t === 'insertReplacementText')) {
|
|
728
|
+
e.preventDefault();
|
|
729
|
+
this.flush();
|
|
730
|
+
const p = this.del(o);
|
|
731
|
+
let at = p.s;
|
|
732
|
+
const s = e.data || (e.dataTransfer && e.dataTransfer.getData('text/plain')) || '';
|
|
733
|
+
if (s && t.startsWith('insert'))
|
|
734
|
+
at = this.insert(s.replace(/\s*\n\s*/g, ' '), p);
|
|
735
|
+
this.set({ s: at, e: at });
|
|
736
|
+
this.commit(o);
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
if (!this.H.dirty)
|
|
740
|
+
this.H.pre = o;
|
|
741
|
+
}
|
|
742
|
+
onDrop(e) {
|
|
743
|
+
e.preventDefault();
|
|
744
|
+
if (this.rev || !e.dataTransfer)
|
|
745
|
+
return;
|
|
746
|
+
const items = this.plain(e.dataTransfer.getData('text/plain'));
|
|
747
|
+
if (!items.length)
|
|
748
|
+
return;
|
|
749
|
+
const doc = document;
|
|
750
|
+
let at = null;
|
|
751
|
+
if (doc.caretPositionFromPoint) {
|
|
752
|
+
const pp = doc.caretPositionFromPoint(e.clientX, e.clientY);
|
|
753
|
+
if (pp)
|
|
754
|
+
at = [pp.offsetNode, pp.offset];
|
|
755
|
+
}
|
|
756
|
+
else if (doc.caretRangeFromPoint) {
|
|
757
|
+
const r = doc.caretRangeFromPoint(e.clientX, e.clientY);
|
|
758
|
+
if (r)
|
|
759
|
+
at = [r.startContainer, r.startOffset];
|
|
760
|
+
}
|
|
761
|
+
if (!at || !this.ed.contains(at[0]))
|
|
762
|
+
return;
|
|
763
|
+
this.flush();
|
|
764
|
+
const a0 = this.offsetOf(at[0], at[1]), end = this.insertLines(items, { s: a0, e: a0 });
|
|
765
|
+
this.set({ s: end, e: end }, true);
|
|
766
|
+
this.commit({ s: a0, e: a0 });
|
|
767
|
+
}
|
|
768
|
+
onKeyDown(e) {
|
|
769
|
+
if (e.isComposing || this.hook.key?.(e))
|
|
770
|
+
return;
|
|
771
|
+
if (this.rev)
|
|
772
|
+
return;
|
|
773
|
+
const mod = isMac() ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey;
|
|
774
|
+
if (!mod)
|
|
775
|
+
return;
|
|
776
|
+
const k = e.key.toLowerCase(), c = e.code;
|
|
777
|
+
const act = e.altKey ? (c === 'Digit1' ? () => this.block('h2') : c === 'Digit0' ? () => this.block('p') : null)
|
|
778
|
+
: e.shiftKey ? (c === 'Digit7' ? () => this.block('ol') : c === 'Digit8' ? () => this.block('ul') : c === 'Digit9' ? () => this.block('quote') : k === 'z' ? () => this.redo() : null)
|
|
779
|
+
: k === 'b' ? () => this.inline('B') : k === 'i' ? () => this.inline('I') : k === 'e' ? () => this.inline('CODE') : k === 'z' ? () => this.undo() : k === 'y' ? () => this.redo() : null;
|
|
780
|
+
if (act) {
|
|
781
|
+
e.preventDefault();
|
|
782
|
+
e.stopPropagation();
|
|
783
|
+
act();
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
// ---- public helpers used by the component ----
|
|
787
|
+
focus() { this.set(this.get(), true); }
|
|
788
|
+
html() { return this.ed.innerHTML; }
|
|
789
|
+
reviewing() { return !!this.rev; }
|
|
790
|
+
canUndo() { return this.H.at > 0 || this.H.dirty; }
|
|
791
|
+
canRedo() { return this.H.at < this.H.list.length - 1; }
|
|
792
|
+
empty() { const all = this.lines(); return all.length === 1 && !this.len(all[0]) && this.typeOf(all[0]) === 'p'; }
|
|
793
|
+
words() { const s = this.lines().map(b => b.textContent).join(' ').trim(); return s ? s.split(/\s+/).length : 0; }
|
|
794
|
+
line(at) { const i = this.lineAt(at), s = this.startOf(i); return { s, e: s + this.len(this.lines()[i]) }; }
|
|
795
|
+
state() {
|
|
796
|
+
const o = this.get(), all = this.lines(), ts = all.slice(this.lineAt(o.s), this.lineAt(o.e) + 1).map(b => this.typeOf(b)), g = this.live();
|
|
797
|
+
const a = this.up(o.s === o.e && g ? g.startContainer : this.pointAt(o.s, o.s !== o.e)[0], 'A');
|
|
798
|
+
return { B: this.has('B', o), I: this.has('I', o), CODE: this.has('CODE', o), A: o.s === o.e ? !!a : this.has('A', o), href: a ? a.getAttribute('href') : null, block: ts.every(t => t === ts[0]) ? ts[0] : null };
|
|
799
|
+
}
|
|
800
|
+
remove(o) { this.flush(); this.set(this.del(o)); this.commit(o); }
|
|
801
|
+
type(s) { const o = this.get(); this.flush(); const at = this.insert(s, o); this.set({ s: at, e: at }); this.typed(o); this.showRange(this.range({ s: at, e: at })); }
|
|
802
|
+
show(o) { this.showRange(this.range(o)); }
|
|
803
|
+
destroy() { clearTimeout(this.H.t); this.offs.forEach(f => f()); this.offs = []; }
|
|
804
|
+
}
|
|
805
|
+
/* ---------- the demo's writer: canned rewrites for the preview's draft, and simple rules for anything else ---------- */
|
|
806
|
+
const CANNED = {
|
|
807
|
+
'We know pricing changes can feel like a lot, so we want to make sure everyone has plenty of time to look at the new plans and ask us questions before anything changes.': { shorter: "We're giving everyone time to review the new plans and ask questions before anything changes.", improve: 'Pricing changes can feel like a lot, so everyone gets plenty of time to review the new plans and ask questions before anything changes.' },
|
|
808
|
+
'New pricing goes live on March 3.': { improve: 'Our new pricing goes live on March 3.', shorter: 'New pricing starts March 3.' },
|
|
809
|
+
'Starter teams get two more seats for free, and every plan now includes the agent.': { improve: 'Starter teams get two extra seats at no cost, and every plan now includes the agent.', shorter: 'Starter teams get two free seats, and every plan includes the agent.' },
|
|
810
|
+
};
|
|
811
|
+
const TYPO = { teh: 'the', recieve: 'receive', seperate: 'separate', definately: 'definitely', alot: 'a lot', dont: "don't", cant: "can't", wont: "won't", im: "I'm", ive: "I've", thier: 'their', untill: 'until', occured: 'occurred', wich: 'which', becuase: 'because', youre: "you're", doesnt: "doesn't", isnt: "isn't", tommorow: 'tomorrow', accross: 'across' };
|
|
812
|
+
const FILLER = [[/\b(really|very|just|actually|basically|quite|simply|definitely|certainly|literally|totally)\s+/gi, ''], [/\bin order to\b/gi, 'to'], [/\bmake sure (that )?/gi, 'ensure '], [/\bdue to the fact that\b/gi, 'because'], [/\bat this point in time\b/gi, 'now'], [/\ba lot of\b/gi, 'many'], [/\bplenty of\b/gi, 'enough'], [/\bis able to\b/gi, 'can']];
|
|
813
|
+
const BETTER = [[/\bwe will\b/gi, "we'll"], [/\bwe are\b/gi, "we're"], [/\bit is\b/gi, "it's"], [/\bdo not\b/gi, "don't"], [/\bcannot\b/gi, "can't"], [/\bvery important\b/gi, 'essential'], [/\bgood\b/gi, 'strong'], [/\bbig\b/gi, 'major'], [/\bstuff\b/gi, 'details'], [/\bkind of\s+/gi, ''], [/\bat no extra cost\b/gi, 'free']];
|
|
814
|
+
/** The demo's stand-in for a model: canned rewrites for the preview's draft about a pricing launch, and simple rules for anything else */
|
|
815
|
+
export function demoWrite(action, text, doc) {
|
|
816
|
+
const fix = (s) => s.replace(/[ \t]{2,}/g, ' ').replace(/\s+([,.!?;:])/g, '$1').replace(/\bi\b/g, 'I')
|
|
817
|
+
.replace(/\b[a-z]+\b/gi, w => { const f = TYPO[w.toLowerCase()]; return f ? (w[0] === w[0].toUpperCase() ? f[0].toUpperCase() + f.slice(1) : f) : w; })
|
|
818
|
+
.replace(/(^|[.!?]\s+)([a-z])/g, (_, a, b) => a + b.toUpperCase()).replace(/([a-z0-9])\s*$/i, (m, a) => s.trim().split(/\s+/).length > 3 ? a + '.' : m);
|
|
819
|
+
if (action === 'continue') {
|
|
820
|
+
const next = /pric|plan|seat|launch/i.test(doc)
|
|
821
|
+
? ['Current customers keep their price until their next renewal, and every admin gets an email that sums up what changes for their team.', 'If anything is unclear, reply to this email and we will walk you through it.']
|
|
822
|
+
: ['Next, we will share a short summary so everyone knows what changes and when.', 'Reply with any questions and we will get back to you within a day.'];
|
|
823
|
+
return next.find(x => !doc.includes(x)) || next[next.length - 1];
|
|
824
|
+
}
|
|
825
|
+
if (action === 'grammar')
|
|
826
|
+
return fix(text);
|
|
827
|
+
const rules = (s, list) => list.reduce((x, [a, b]) => x.replace(a, b), s);
|
|
828
|
+
return (text.match(/[^]*?(?:[.!?]+(?=\s|$)|$)\s*/g) || [text]).filter(Boolean).map(s => {
|
|
829
|
+
const k = s.trim(), hit = CANNED[k] && CANNED[k][action];
|
|
830
|
+
if (hit)
|
|
831
|
+
return s.replace(k, hit);
|
|
832
|
+
let x = fix(rules(s, action === 'shorter' ? FILLER : [...FILLER.slice(0, 2), ...BETTER]));
|
|
833
|
+
if (action === 'shorter' && x.trim().length > 60 && x.length > s.length * .85 && x.includes(', '))
|
|
834
|
+
x = x.slice(0, x.indexOf(', ')) + '.' + (/\s$/.test(s) ? ' ' : '');
|
|
835
|
+
return x;
|
|
836
|
+
}).join('');
|
|
837
|
+
}
|
|
838
|
+
/** The default `ai`: demoWrite's answer, streamed a word at a time after a short pause, as a model would */
|
|
839
|
+
export const demoAi = async function* ({ action, text, document: doc, signal }) {
|
|
840
|
+
const wait = (ms) => new Promise(res => setTimeout(res, ms));
|
|
841
|
+
const reduce = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
842
|
+
const out = demoWrite(action, text, doc);
|
|
843
|
+
if (reduce) {
|
|
844
|
+
yield out;
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
await wait(450);
|
|
848
|
+
for (const w of out.match(/\S+\s*|\s+/g) || []) {
|
|
849
|
+
if (signal.aborted)
|
|
850
|
+
return;
|
|
851
|
+
yield w;
|
|
852
|
+
await wait(48);
|
|
853
|
+
}
|
|
854
|
+
};
|
|
855
|
+
const ACTIONS = [
|
|
856
|
+
{ key: 'improve', label: 'Improve writing', icon: 'spark' },
|
|
857
|
+
{ key: 'shorter', label: 'Make shorter', icon: 'minus' },
|
|
858
|
+
{ key: 'grammar', label: 'Fix grammar', icon: 'check' },
|
|
859
|
+
{ key: 'continue', label: 'Continue writing', icon: 'edit', kind: 'add' },
|
|
860
|
+
];
|
|
861
|
+
const keysOf = (k, mac) => k === 'redo' ? (mac ? '⇧⌘Z' : 'Ctrl+Y')
|
|
862
|
+
: k.split(' ').map(x => ({ mod: mac ? '⌘' : 'Ctrl', alt: mac ? '⌥' : 'Alt', shift: mac ? '⇧' : 'Shift' })[x] || x).join(mac ? '' : '+');
|
|
863
|
+
const TOOLS = [
|
|
864
|
+
{ f: 'h2', label: 'Heading', icon: 'file-text', k: 'mod alt 1' }, { f: 'b', label: 'Bold', icon: 'edit', k: 'mod B' }, { f: 'i', label: 'Italic', icon: 'pr', k: 'mod I' },
|
|
865
|
+
{ f: 'code', label: 'Inline code', icon: 'term', k: 'mod E' }, { f: 'a', label: 'Link', icon: 'ext', k: 'mod K' },
|
|
866
|
+
{ f: 'ul', label: 'Bulleted list', icon: 'more', k: 'mod shift 8' }, { f: 'ol', label: 'Numbered list', icon: 'more', k: 'mod shift 7' }, { f: 'quote', label: 'Quote', icon: 'comment', k: 'mod shift 9' },
|
|
867
|
+
];
|
|
868
|
+
/** A minimal editor for a draft an agent helps with. Select text and press Ask AI (or Mod+J, or type / on a new line), and a
|
|
869
|
+
suggestion streams in beside the text, the old words struck through, to accept with Tab/Enter or discard with Escape. */
|
|
870
|
+
export class RichTextEditorComponent {
|
|
871
|
+
constructor() {
|
|
872
|
+
this.defaultValue = '';
|
|
873
|
+
this.placeholder = 'Write a draft, or type / on a new line for AI';
|
|
874
|
+
this.label = 'Draft';
|
|
875
|
+
this.hint = 'Select text to ask AI';
|
|
876
|
+
/** Writes the AI's suggestions. Defaults to the demo writer; pass your model call, or false to hide the AI */
|
|
877
|
+
this.ai = demoAi;
|
|
878
|
+
/** The AI menu. Defaults to Improve writing, Make shorter, Fix grammar and Continue writing */
|
|
879
|
+
this.aiActions = ACTIONS;
|
|
880
|
+
/** Called with the HTML after each change the person makes */
|
|
881
|
+
this.valueChange = new EventEmitter();
|
|
882
|
+
/** Called when a suggestion is accepted or discarded */
|
|
883
|
+
this.suggestion = new EventEmitter();
|
|
884
|
+
this.motion = inject(ReducedMotionService);
|
|
885
|
+
this.eng = null;
|
|
886
|
+
this.emitted = null;
|
|
887
|
+
this.quiet = false;
|
|
888
|
+
this.picked = null;
|
|
889
|
+
this.runToken = null;
|
|
890
|
+
this.uid = 'rte-' + Math.random().toString(36).slice(2, 7);
|
|
891
|
+
this.mac = false;
|
|
892
|
+
this.tools = TOOLS.map(t => ({ ...t, on: false, kbd: '' }));
|
|
893
|
+
this.items = this.aiActions.map(a => ({ ...a, off: false }));
|
|
894
|
+
this.focusTb = 0;
|
|
895
|
+
this.words = 0;
|
|
896
|
+
this.empty = true;
|
|
897
|
+
this.canUndo = false;
|
|
898
|
+
this.canRedo = false;
|
|
899
|
+
this.hasHref = false;
|
|
900
|
+
this.job = null;
|
|
901
|
+
this.lk = null;
|
|
902
|
+
this.url = '';
|
|
903
|
+
this.bad = false;
|
|
904
|
+
this.bubble = false;
|
|
905
|
+
this.review = null;
|
|
906
|
+
this.say = '';
|
|
907
|
+
this.aiKbd = '';
|
|
908
|
+
this.undoKbd = '';
|
|
909
|
+
this.redoKbd = '';
|
|
910
|
+
}
|
|
911
|
+
get bodyEl() { return this.bodyRef.nativeElement; }
|
|
912
|
+
get menuHeading() {
|
|
913
|
+
if (this.job?.sel)
|
|
914
|
+
return 'Edit the selection';
|
|
915
|
+
return this.items.some(x => !x.off && (x.kind || 'swap') === 'swap') ? 'Edit this paragraph' : 'Write with AI';
|
|
916
|
+
}
|
|
917
|
+
get reviewLabel() { return this.aiActions.find(a => a.key === this.review?.action)?.label || ''; }
|
|
918
|
+
ngOnChanges(changes) {
|
|
919
|
+
if (changes['aiActions'])
|
|
920
|
+
this.items = this.aiActions.map(a => ({ ...a, off: false }));
|
|
921
|
+
if (changes['value'] && this.eng && this.value !== undefined && this.value !== this.emitted) {
|
|
922
|
+
if (this.eng.reviewing()) {
|
|
923
|
+
this.runToken?.ctl.abort();
|
|
924
|
+
this.runToken = null;
|
|
925
|
+
this.review = null;
|
|
926
|
+
}
|
|
927
|
+
this.load(this.value);
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
ngAfterViewInit() {
|
|
931
|
+
this.mac = isMac();
|
|
932
|
+
this.aiKbd = keysOf('mod J', this.mac);
|
|
933
|
+
this.undoKbd = keysOf('mod Z', this.mac);
|
|
934
|
+
this.redoKbd = keysOf('redo', this.mac);
|
|
935
|
+
this.tools = TOOLS.map(t => ({ ...t, on: false, kbd: keysOf(t.k, this.mac) }));
|
|
936
|
+
const E = new RteEngine(this.bodyEl, {
|
|
937
|
+
change: () => this.paint(),
|
|
938
|
+
select: () => { this.paint(); this.showBubble(); },
|
|
939
|
+
input: e => { if (e.inputType === 'insertText' && e.data === '/') {
|
|
940
|
+
const o = E.get();
|
|
941
|
+
if (o.s === o.e && E.line(o.s).s === o.s - 1)
|
|
942
|
+
this.openMenu('slash');
|
|
943
|
+
} },
|
|
944
|
+
key: e => this.engineKey(e),
|
|
945
|
+
});
|
|
946
|
+
this.eng = E;
|
|
947
|
+
this.load(this.value ?? this.defaultValue);
|
|
948
|
+
this.down = (e) => {
|
|
949
|
+
const t = e.target;
|
|
950
|
+
if (this.job && !this.menuRef?.nativeElement.contains(t) && !this.askRef?.nativeElement.contains(t) && !t.closest?.('.vo-rte-ai'))
|
|
951
|
+
this.closeMenu(false);
|
|
952
|
+
if (this.lk && !this.lnkRef.nativeElement.contains(t) && !t.closest?.('[data-f="a"]'))
|
|
953
|
+
this.closeLink(false);
|
|
954
|
+
if (e.isTrusted && !this.askRef?.nativeElement.contains(t) && !this.job) {
|
|
955
|
+
this.bubble = false;
|
|
956
|
+
if (!this.rootRef.nativeElement.contains(t))
|
|
957
|
+
this.pick(null);
|
|
958
|
+
}
|
|
959
|
+
};
|
|
960
|
+
this.resize = () => { this.closeMenu(false); this.closeLink(false); this.bubble = false; };
|
|
961
|
+
document.addEventListener('pointerdown', this.down);
|
|
962
|
+
addEventListener('resize', this.resize);
|
|
963
|
+
this.paint();
|
|
964
|
+
}
|
|
965
|
+
ngOnDestroy() {
|
|
966
|
+
this.runToken?.ctl.abort();
|
|
967
|
+
this.runToken = null;
|
|
968
|
+
this.pick(null);
|
|
969
|
+
this.eng?.destroy();
|
|
970
|
+
this.eng = null;
|
|
971
|
+
if (this.down)
|
|
972
|
+
document.removeEventListener('pointerdown', this.down);
|
|
973
|
+
if (this.resize)
|
|
974
|
+
removeEventListener('resize', this.resize);
|
|
975
|
+
}
|
|
976
|
+
reduce() { return this.motion.reduce(); }
|
|
977
|
+
announce(t) { this.say = ''; setTimeout(() => { this.say = t; }, 60); }
|
|
978
|
+
paint() {
|
|
979
|
+
const E = this.eng;
|
|
980
|
+
if (!E)
|
|
981
|
+
return;
|
|
982
|
+
const s = E.state();
|
|
983
|
+
this.tools = this.tools.map(t => ({ ...t, on: t.f === 'a' ? s.A : /^(h2|ul|ol|quote)$/.test(t.f) ? s.block === t.f : !!s[t.f.toUpperCase()] }));
|
|
984
|
+
this.hasHref = !!s.href;
|
|
985
|
+
this.words = E.words();
|
|
986
|
+
this.empty = E.empty();
|
|
987
|
+
this.canUndo = E.canUndo();
|
|
988
|
+
this.canRedo = E.canRedo();
|
|
989
|
+
this.items = this.items.map(a => ({ ...a, off: (a.kind || 'swap') === 'swap' && !!this.job && !(E.text(this.job.t).trim()) }));
|
|
990
|
+
if (!E.reviewing() && !this.quiet) {
|
|
991
|
+
const html = E.html();
|
|
992
|
+
if (html !== this.emitted) {
|
|
993
|
+
this.emitted = html;
|
|
994
|
+
this.valueChange.emit(html);
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
load(html) { const E = this.eng; if (!E)
|
|
999
|
+
return; this.quiet = true; E.load(html); this.quiet = false; this.emitted = E.html(); this.paint(); }
|
|
1000
|
+
// ---- placement of the popovers inside the editor ----
|
|
1001
|
+
rectsOf(o) {
|
|
1002
|
+
const E = this.eng, rs = [...E.range(o).getClientRects()].filter(x => x.width || x.height);
|
|
1003
|
+
if (rs.length)
|
|
1004
|
+
return [rs[0], rs[rs.length - 1]];
|
|
1005
|
+
const n = E.range(E.line(o.s)).startContainer, el = (n.nodeType === 3 ? n.parentElement : n), rr = el.getBoundingClientRect();
|
|
1006
|
+
return [rr, rr];
|
|
1007
|
+
}
|
|
1008
|
+
place(el, o, above = false) {
|
|
1009
|
+
const box = this.rootRef?.nativeElement;
|
|
1010
|
+
if (!el || !box)
|
|
1011
|
+
return;
|
|
1012
|
+
const b = box.getBoundingClientRect(), w = el.offsetWidth, h = el.offsetHeight, top = (this.tbRef.nativeElement.offsetHeight || 44) - 2, [f, l] = this.rectsOf(o);
|
|
1013
|
+
const over = f.top - b.top - h - 6, under = l.bottom - b.top + 6;
|
|
1014
|
+
const y = above ? (over >= top ? over : under) : under + h <= b.height - 4 || over < top ? under : over;
|
|
1015
|
+
el.style.left = Math.round(Math.max(6, Math.min((above ? f : l).left - b.left - (above ? 0 : 8), b.width - w - 6))) + 'px';
|
|
1016
|
+
el.style.top = Math.round(Math.max(4, Math.min(y, b.height - h - 4))) + 'px';
|
|
1017
|
+
}
|
|
1018
|
+
pick(o) {
|
|
1019
|
+
const reg = typeof CSS !== 'undefined' ? CSS.highlights : undefined;
|
|
1020
|
+
const HL = typeof window !== 'undefined' ? window.Highlight : undefined;
|
|
1021
|
+
if (!reg || !HL)
|
|
1022
|
+
return;
|
|
1023
|
+
let h = reg.get('rte-pick');
|
|
1024
|
+
if (!h) {
|
|
1025
|
+
h = new HL();
|
|
1026
|
+
reg.set('rte-pick', h);
|
|
1027
|
+
}
|
|
1028
|
+
if (this.picked)
|
|
1029
|
+
h.delete(this.picked);
|
|
1030
|
+
this.picked = o && o.s !== o.e && this.eng ? this.eng.range(o) : null;
|
|
1031
|
+
if (this.picked)
|
|
1032
|
+
h.add(this.picked);
|
|
1033
|
+
}
|
|
1034
|
+
showBubble(o) {
|
|
1035
|
+
const E = this.eng;
|
|
1036
|
+
if (!E)
|
|
1037
|
+
return;
|
|
1038
|
+
const g = getSelection(), sel = o || (document.activeElement === this.bodyEl && g && g.rangeCount && !g.isCollapsed ? E.get() : null);
|
|
1039
|
+
if (!sel || E.reviewing() || this.job || this.lk || this.ai === false || !E.text(sel).trim()) {
|
|
1040
|
+
this.bubble = false;
|
|
1041
|
+
return;
|
|
1042
|
+
}
|
|
1043
|
+
this.place(this.askRef?.nativeElement, sel, true);
|
|
1044
|
+
this.bubble = true;
|
|
1045
|
+
}
|
|
1046
|
+
// ---- toolbar ----
|
|
1047
|
+
keepFocus(e) { if (e.target.closest('button'))
|
|
1048
|
+
e.preventDefault(); }
|
|
1049
|
+
tbButtons() { return [...(this.tbRef.nativeElement.querySelectorAll('button:not(:disabled)'))]; }
|
|
1050
|
+
tbKey(e) {
|
|
1051
|
+
const all = this.tbButtons(), i = all.indexOf(document.activeElement);
|
|
1052
|
+
if (i < 0)
|
|
1053
|
+
return;
|
|
1054
|
+
const go = { ArrowRight: all[(i + 1) % all.length], ArrowLeft: all[(i - 1 + all.length) % all.length], Home: all[0], End: all[all.length - 1] }[e.key];
|
|
1055
|
+
if (go) {
|
|
1056
|
+
e.preventDefault();
|
|
1057
|
+
go.focus();
|
|
1058
|
+
this.focusTb = this.tbButtonIndex(go);
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
tbButtonIndex(b) { return [...this.tbRef.nativeElement.querySelectorAll('button')].indexOf(b); }
|
|
1062
|
+
apply(f, e) {
|
|
1063
|
+
const E = this.eng;
|
|
1064
|
+
if (!E || E.reviewing())
|
|
1065
|
+
return;
|
|
1066
|
+
const mine = e.isTrusted, key = e.detail === 0;
|
|
1067
|
+
if (f === 'a') {
|
|
1068
|
+
if (this.lk)
|
|
1069
|
+
this.closeLink(true);
|
|
1070
|
+
else
|
|
1071
|
+
this.openLink(mine, mine && key);
|
|
1072
|
+
return;
|
|
1073
|
+
}
|
|
1074
|
+
if (f === 'b' || f === 'i' || f === 'code')
|
|
1075
|
+
E.inline(f.toUpperCase());
|
|
1076
|
+
else
|
|
1077
|
+
E.block(f);
|
|
1078
|
+
if (mine)
|
|
1079
|
+
E.focus();
|
|
1080
|
+
}
|
|
1081
|
+
doUndo(e) { this.eng?.undo(); if (e.isTrusted)
|
|
1082
|
+
this.eng?.focus(); }
|
|
1083
|
+
doRedo(e) { this.eng?.redo(); if (e.isTrusted)
|
|
1084
|
+
this.eng?.focus(); }
|
|
1085
|
+
onAiButton(e) { this.openMenu(e.isTrusted ? (e.detail ? 'click' : 'button') : 'script'); }
|
|
1086
|
+
onAskButton(e) { this.openMenu(e.isTrusted ? 'click' : 'script'); }
|
|
1087
|
+
// ---- the AI menu ----
|
|
1088
|
+
menuItemEls() { return [...(this.menuRef?.nativeElement.querySelectorAll('[role="menuitem"]') || [])].filter(m => m.getAttribute('aria-disabled') !== 'true'); }
|
|
1089
|
+
focusItem(m) { if (!m)
|
|
1090
|
+
return; this.menuItemEls().forEach(x => { x.tabIndex = x === m ? 0 : -1; }); m.focus({ preventScroll: true }); }
|
|
1091
|
+
openMenu(how) {
|
|
1092
|
+
const E = this.eng;
|
|
1093
|
+
if (!E || E.reviewing() || this.ai === false)
|
|
1094
|
+
return;
|
|
1095
|
+
this.closeLink(false);
|
|
1096
|
+
E.flush();
|
|
1097
|
+
if (this.job) {
|
|
1098
|
+
this.closeMenu(how !== 'script');
|
|
1099
|
+
return;
|
|
1100
|
+
}
|
|
1101
|
+
const o = E.get(), slash = how === 'slash' ? o.s - 1 : null, sel = o.s !== o.e;
|
|
1102
|
+
let t = sel ? o : E.line(o.s);
|
|
1103
|
+
if (slash !== null)
|
|
1104
|
+
t = { s: slash + 1, e: t.e };
|
|
1105
|
+
this.job = { o, t, slash, sel, btn: how === 'button' };
|
|
1106
|
+
this.bubble = false;
|
|
1107
|
+
this.pick(sel ? o : null);
|
|
1108
|
+
this.paint();
|
|
1109
|
+
requestAnimationFrame(() => { this.place(this.menuRef?.nativeElement, o); if (how !== 'script')
|
|
1110
|
+
this.focusItem(this.menuItemEls()[0]); });
|
|
1111
|
+
}
|
|
1112
|
+
closeMenu(back) {
|
|
1113
|
+
const j = this.job;
|
|
1114
|
+
if (!j)
|
|
1115
|
+
return;
|
|
1116
|
+
this.job = null;
|
|
1117
|
+
this.pick(null);
|
|
1118
|
+
this.paint();
|
|
1119
|
+
if (back && j.btn) {
|
|
1120
|
+
this.eng?.set(j.o);
|
|
1121
|
+
this.rootRef.nativeElement.querySelector('.vo-rte-ai')?.focus({ preventScroll: true });
|
|
1122
|
+
}
|
|
1123
|
+
else if (back)
|
|
1124
|
+
this.eng?.set(j.o, true);
|
|
1125
|
+
}
|
|
1126
|
+
menuKey(e) {
|
|
1127
|
+
const all = this.menuItemEls(), i = all.indexOf(document.activeElement);
|
|
1128
|
+
const go = { ArrowDown: all[(i + 1) % all.length], ArrowUp: all[(i - 1 + all.length) % all.length], Home: all[0], End: all[all.length - 1] }[e.key];
|
|
1129
|
+
if (go) {
|
|
1130
|
+
e.preventDefault();
|
|
1131
|
+
this.focusItem(go);
|
|
1132
|
+
}
|
|
1133
|
+
else if (e.key === 'Escape' || e.key === 'Tab') {
|
|
1134
|
+
e.preventDefault();
|
|
1135
|
+
e.stopPropagation();
|
|
1136
|
+
this.closeMenu(true);
|
|
1137
|
+
}
|
|
1138
|
+
else if (e.key.length === 1 && /\S/.test(e.key) && !e.metaKey && !e.ctrlKey) {
|
|
1139
|
+
const k = e.key.toLowerCase(), hit = [...all.slice(i + 1), ...all.slice(0, i + 1)].find(m => (m.textContent || '').trim().toLowerCase().startsWith(k));
|
|
1140
|
+
if (hit)
|
|
1141
|
+
this.focusItem(hit);
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
onMenuItem(a, e) { if (!a.off)
|
|
1145
|
+
this.ask(a.key, e.isTrusted); }
|
|
1146
|
+
here(E) { const o = E.get(), sel = o.s !== o.e; return { o, t: sel ? o : E.line(o.s), slash: null, sel }; }
|
|
1147
|
+
ask(key, mine) {
|
|
1148
|
+
const E = this.eng, j = this.job || (E && this.here(E));
|
|
1149
|
+
const act = this.aiActions.find(a => a.key === key), writer = this.ai;
|
|
1150
|
+
if (!E || !j || !act || writer === false || E.reviewing())
|
|
1151
|
+
return;
|
|
1152
|
+
this.closeMenu(false);
|
|
1153
|
+
let t = j.t, end = j.o.e;
|
|
1154
|
+
if (j.slash !== null) {
|
|
1155
|
+
const sl = j.slash;
|
|
1156
|
+
E.remove({ s: sl, e: sl + 1 });
|
|
1157
|
+
const back = (x) => x > sl ? x - 1 : x;
|
|
1158
|
+
t = { s: back(t.s), e: back(t.e) };
|
|
1159
|
+
end = back(end);
|
|
1160
|
+
}
|
|
1161
|
+
const kind = act.kind || 'swap';
|
|
1162
|
+
if (kind === 'add')
|
|
1163
|
+
t = { s: end, e: end };
|
|
1164
|
+
else if (!E.text(t).trim())
|
|
1165
|
+
return;
|
|
1166
|
+
const doc = E.text({ s: 0, e: E.total() }), before = E.text({ s: 0, e: t.s }), after = E.text({ s: t.e, e: E.total() }), said = E.text(t);
|
|
1167
|
+
const write = E.suggest(t, kind), ctl = new AbortController(), me = { ctl, action: key };
|
|
1168
|
+
this.runToken = me;
|
|
1169
|
+
let got = '', first = true;
|
|
1170
|
+
const put = (s) => { if (first && kind === 'add' && before && !/\s$/.test(before) && !/^\s/.test(s))
|
|
1171
|
+
s = ' ' + s; first = false; got += s; write(s); };
|
|
1172
|
+
this.review = { action: key, ready: false };
|
|
1173
|
+
this.bubble = false;
|
|
1174
|
+
this.paint();
|
|
1175
|
+
this.announce(`${act.label}: writing a suggestion`);
|
|
1176
|
+
if (mine)
|
|
1177
|
+
E.focus();
|
|
1178
|
+
(async () => {
|
|
1179
|
+
try {
|
|
1180
|
+
const res = writer({ action: key, text: kind === 'add' ? '' : said, before, after, document: doc, signal: ctl.signal });
|
|
1181
|
+
if (typeof res === 'string' || res instanceof Promise) {
|
|
1182
|
+
const s = await res;
|
|
1183
|
+
if (this.runToken !== me)
|
|
1184
|
+
return;
|
|
1185
|
+
if (this.reduce())
|
|
1186
|
+
put(s);
|
|
1187
|
+
else
|
|
1188
|
+
for (const w of s.match(/\S+\s*|\s+/g) || []) {
|
|
1189
|
+
if (this.runToken !== me)
|
|
1190
|
+
return;
|
|
1191
|
+
put(w);
|
|
1192
|
+
await new Promise(r => setTimeout(r, 48));
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
else
|
|
1196
|
+
for await (const chunk of res) {
|
|
1197
|
+
if (this.runToken !== me)
|
|
1198
|
+
return;
|
|
1199
|
+
put(chunk);
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
catch (err) {
|
|
1203
|
+
if (this.runToken !== me)
|
|
1204
|
+
return;
|
|
1205
|
+
console.error(err);
|
|
1206
|
+
}
|
|
1207
|
+
if (this.runToken !== me)
|
|
1208
|
+
return;
|
|
1209
|
+
if (!got.trim()) {
|
|
1210
|
+
this.finish(false, true);
|
|
1211
|
+
return;
|
|
1212
|
+
}
|
|
1213
|
+
this.review = { action: key, ready: true };
|
|
1214
|
+
this.paint();
|
|
1215
|
+
const s = got.trim();
|
|
1216
|
+
this.announce(`Suggestion: ${s}${/[.!?]$/.test(s) ? '' : '.'} Press Tab or Enter to accept, or Escape to discard.`);
|
|
1217
|
+
})();
|
|
1218
|
+
}
|
|
1219
|
+
finish(keep, mine) {
|
|
1220
|
+
const E = this.eng, r = this.runToken;
|
|
1221
|
+
if (!E || !E.reviewing() || !r)
|
|
1222
|
+
return;
|
|
1223
|
+
if (keep && !this.review?.ready)
|
|
1224
|
+
return;
|
|
1225
|
+
const said = E.newText();
|
|
1226
|
+
this.runToken = null;
|
|
1227
|
+
r.ctl.abort();
|
|
1228
|
+
if (keep)
|
|
1229
|
+
E.accept();
|
|
1230
|
+
else
|
|
1231
|
+
E.discard();
|
|
1232
|
+
this.review = null;
|
|
1233
|
+
this.paint();
|
|
1234
|
+
this.announce(keep ? 'Suggestion accepted' : 'Suggestion discarded');
|
|
1235
|
+
this.suggestion.emit({ action: r.action, text: said, accepted: keep });
|
|
1236
|
+
if (mine)
|
|
1237
|
+
E.focus();
|
|
1238
|
+
}
|
|
1239
|
+
// ---- the link field ----
|
|
1240
|
+
openLink(mine, btn = false) {
|
|
1241
|
+
const E = this.eng;
|
|
1242
|
+
if (!E || E.reviewing())
|
|
1243
|
+
return;
|
|
1244
|
+
this.closeMenu(false);
|
|
1245
|
+
E.flush();
|
|
1246
|
+
const o = E.get(), s = E.state();
|
|
1247
|
+
this.lk = { o, btn };
|
|
1248
|
+
this.url = s.href || '';
|
|
1249
|
+
this.bad = false;
|
|
1250
|
+
this.bubble = false;
|
|
1251
|
+
this.hasHref = !!s.href;
|
|
1252
|
+
this.pick(o);
|
|
1253
|
+
requestAnimationFrame(() => { this.place(this.lnkRef.nativeElement, o); if (mine)
|
|
1254
|
+
this.urlRef.nativeElement.focus({ preventScroll: true }); });
|
|
1255
|
+
}
|
|
1256
|
+
closeLink(back) {
|
|
1257
|
+
const j = this.lk;
|
|
1258
|
+
if (!j)
|
|
1259
|
+
return;
|
|
1260
|
+
this.lk = null;
|
|
1261
|
+
this.pick(null);
|
|
1262
|
+
if (back && j.btn) {
|
|
1263
|
+
this.eng?.set(j.o);
|
|
1264
|
+
this.tbRef.nativeElement.querySelector('[data-f="a"]')?.focus({ preventScroll: true });
|
|
1265
|
+
}
|
|
1266
|
+
else if (back)
|
|
1267
|
+
this.eng?.set(j.o, true);
|
|
1268
|
+
}
|
|
1269
|
+
toUrl(v) { v = v.trim(); if (!v)
|
|
1270
|
+
return null; if (/^(https?:\/\/|mailto:)/i.test(v))
|
|
1271
|
+
return v; if (/^[^\s@/]+@[^\s@]+\.[^\s@]+$/.test(v))
|
|
1272
|
+
return 'mailto:' + v; if (/^[\w-]+(\.[\w-]+)+(:\d+)?([/?#]\S*)?$/.test(v))
|
|
1273
|
+
return 'https://' + v; return null; }
|
|
1274
|
+
applyLink(href) {
|
|
1275
|
+
const E = this.eng, j = this.lk;
|
|
1276
|
+
if (!E || !j)
|
|
1277
|
+
return;
|
|
1278
|
+
if (href === '') {
|
|
1279
|
+
const h = this.toUrl(this.url);
|
|
1280
|
+
if (!h) {
|
|
1281
|
+
this.bad = true;
|
|
1282
|
+
this.urlRef.nativeElement.focus({ preventScroll: true });
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1285
|
+
href = h;
|
|
1286
|
+
}
|
|
1287
|
+
this.closeLink(false);
|
|
1288
|
+
E.set(j.o);
|
|
1289
|
+
E.link(j.o, href);
|
|
1290
|
+
E.focus();
|
|
1291
|
+
}
|
|
1292
|
+
onUrlInput(e) { this.url = e.target.value; this.bad = false; }
|
|
1293
|
+
lnkKey(e) { if (e.key === 'Enter' && e.target === this.urlRef.nativeElement) {
|
|
1294
|
+
e.preventDefault();
|
|
1295
|
+
this.applyLink('');
|
|
1296
|
+
}
|
|
1297
|
+
else if (e.key === 'Escape') {
|
|
1298
|
+
e.preventDefault();
|
|
1299
|
+
e.stopPropagation();
|
|
1300
|
+
this.closeLink(true);
|
|
1301
|
+
} }
|
|
1302
|
+
lnkBlur(e) { if (this.lk && e.relatedTarget && !this.lnkRef.nativeElement.contains(e.relatedTarget))
|
|
1303
|
+
this.closeLink(false); }
|
|
1304
|
+
// ---- root-level keys ----
|
|
1305
|
+
engineKey(e) {
|
|
1306
|
+
const E = this.eng;
|
|
1307
|
+
if (E.reviewing()) {
|
|
1308
|
+
if ((e.key === 'Tab' || e.key === 'Enter') && !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey) {
|
|
1309
|
+
e.preventDefault();
|
|
1310
|
+
this.finish(true, true);
|
|
1311
|
+
return true;
|
|
1312
|
+
}
|
|
1313
|
+
if (e.key === 'Escape' || ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z')) {
|
|
1314
|
+
e.preventDefault();
|
|
1315
|
+
e.stopPropagation();
|
|
1316
|
+
this.finish(false, true);
|
|
1317
|
+
return true;
|
|
1318
|
+
}
|
|
1319
|
+
return false;
|
|
1320
|
+
}
|
|
1321
|
+
const mod = isMac() ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey, k = e.key.toLowerCase();
|
|
1322
|
+
if (mod && !e.altKey && !e.shiftKey && (k === 'k' || (k === 'j' && this.ai !== false))) {
|
|
1323
|
+
e.preventDefault();
|
|
1324
|
+
e.stopPropagation();
|
|
1325
|
+
if (k === 'k')
|
|
1326
|
+
this.openLink(true);
|
|
1327
|
+
else
|
|
1328
|
+
this.openMenu('key');
|
|
1329
|
+
return true;
|
|
1330
|
+
}
|
|
1331
|
+
if (e.key === 'Escape') {
|
|
1332
|
+
this.bubble = false;
|
|
1333
|
+
return false;
|
|
1334
|
+
}
|
|
1335
|
+
return false;
|
|
1336
|
+
}
|
|
1337
|
+
onRootKey(e) { if (e.key === 'Escape' && this.review && !this.bodyEl.contains(e.target)) {
|
|
1338
|
+
e.preventDefault();
|
|
1339
|
+
e.stopPropagation();
|
|
1340
|
+
this.finish(false, true);
|
|
1341
|
+
} }
|
|
1342
|
+
onRootPointerDown(e) { if (e.isTrusted && !this.job)
|
|
1343
|
+
this.pick(null); }
|
|
1344
|
+
// ---- imperative handle, for scripted demos ----
|
|
1345
|
+
focus() { this.eng?.focus(); }
|
|
1346
|
+
getHTML() { return this.eng?.html() || ''; }
|
|
1347
|
+
getText() { const E = this.eng; return E ? E.text({ s: 0, e: E.total() }) : ''; }
|
|
1348
|
+
setHTML(html) { this.load(html); }
|
|
1349
|
+
select(s) {
|
|
1350
|
+
const E = this.eng;
|
|
1351
|
+
if (!E)
|
|
1352
|
+
return false;
|
|
1353
|
+
const at = E.text({ s: 0, e: E.total() }).indexOf(s);
|
|
1354
|
+
if (at < 0 || !s)
|
|
1355
|
+
return false;
|
|
1356
|
+
const o = { s: at, e: at + s.length };
|
|
1357
|
+
E.set(o);
|
|
1358
|
+
E.show(o);
|
|
1359
|
+
this.pick(o);
|
|
1360
|
+
this.showBubble(o);
|
|
1361
|
+
this.paint();
|
|
1362
|
+
return true;
|
|
1363
|
+
}
|
|
1364
|
+
typeText(s) { this.eng?.type(s); }
|
|
1365
|
+
newLine() { this.eng?.split(); }
|
|
1366
|
+
format(f) { const E = this.eng; if (!E || E.reviewing())
|
|
1367
|
+
return; if (f === 'b' || f === 'i' || f === 'code')
|
|
1368
|
+
E.inline(f.toUpperCase());
|
|
1369
|
+
else
|
|
1370
|
+
E.block(f); }
|
|
1371
|
+
openAi() { this.openMenu('script'); }
|
|
1372
|
+
askAi(a) { this.ask(a, false); }
|
|
1373
|
+
accept() { this.finish(true, false); }
|
|
1374
|
+
discard() { this.finish(false, false); }
|
|
1375
|
+
undo() { this.eng?.undo(); }
|
|
1376
|
+
redo() { this.eng?.redo(); }
|
|
1377
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichTextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1378
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RichTextEditorComponent, isStandalone: true, selector: "vo-rich-text-editor", inputs: { value: "value", defaultValue: "defaultValue", placeholder: "placeholder", label: "label", hint: "hint", ai: "ai", aiActions: "aiActions" }, outputs: { valueChange: "valueChange", suggestion: "suggestion" }, viewQueries: [{ propertyName: "rootRef", first: true, predicate: ["root"], descendants: true }, { propertyName: "tbRef", first: true, predicate: ["tb"], descendants: true }, { propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "askRef", first: true, predicate: ["askEl"], descendants: true }, { propertyName: "menuRef", first: true, predicate: ["menuEl"], descendants: true }, { propertyName: "lnkRef", first: true, predicate: ["lnkEl"], descendants: true }, { propertyName: "urlRef", first: true, predicate: ["urlEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
1379
|
+
<div
|
|
1380
|
+
data-vo=""
|
|
1381
|
+
#root
|
|
1382
|
+
class="vo-rte"
|
|
1383
|
+
[attr.data-st]="review ? 'review' : 'edit'"
|
|
1384
|
+
(keydown)="onRootKey($event)"
|
|
1385
|
+
(pointerdown)="onRootPointerDown($event)"
|
|
1386
|
+
>
|
|
1387
|
+
<div
|
|
1388
|
+
#tb
|
|
1389
|
+
class="vo-rte-tb"
|
|
1390
|
+
role="toolbar"
|
|
1391
|
+
aria-label="Formatting"
|
|
1392
|
+
(mousedown)="keepFocus($event)"
|
|
1393
|
+
(keydown)="tbKey($event)"
|
|
1394
|
+
>
|
|
1395
|
+
@for (t of tools; track t.f; let i = $index) {
|
|
1396
|
+
@if (i === 5) {
|
|
1397
|
+
<span class="vo-rte-sep" aria-hidden="true"></span>
|
|
1398
|
+
}
|
|
1399
|
+
<button
|
|
1400
|
+
type="button"
|
|
1401
|
+
class="vo-rte-b"
|
|
1402
|
+
[class.vo-on]="t.f === 'a' && t.on && !review"
|
|
1403
|
+
[attr.data-f]="t.f"
|
|
1404
|
+
[attr.aria-label]="t.label"
|
|
1405
|
+
[attr.title]="t.label + ' · ' + t.kbd"
|
|
1406
|
+
[disabled]="!!review"
|
|
1407
|
+
[tabIndex]="focusTb === i ? 0 : -1"
|
|
1408
|
+
[attr.aria-haspopup]="t.f === 'a' ? 'dialog' : null"
|
|
1409
|
+
[attr.aria-expanded]="t.f === 'a' ? !!lk : null"
|
|
1410
|
+
[attr.aria-pressed]="t.f !== 'a' ? (!review && t.on) : null"
|
|
1411
|
+
(click)="apply(t.f, $event)"
|
|
1412
|
+
>
|
|
1413
|
+
<vo-icon [name]="t.icon" size="md"></vo-icon>
|
|
1414
|
+
</button>
|
|
1415
|
+
}
|
|
1416
|
+
<span class="vo-sp"></span>
|
|
1417
|
+
@if (ai !== false) {
|
|
1418
|
+
<button
|
|
1419
|
+
type="button"
|
|
1420
|
+
class="vo-rte-ai"
|
|
1421
|
+
aria-label="Ask AI"
|
|
1422
|
+
aria-haspopup="menu"
|
|
1423
|
+
[attr.aria-expanded]="!!job"
|
|
1424
|
+
[attr.title]="'Edit or write with AI · ' + aiKbd"
|
|
1425
|
+
[disabled]="!!review"
|
|
1426
|
+
[tabIndex]="focusTb === tools.length ? 0 : -1"
|
|
1427
|
+
(click)="onAiButton($event)"
|
|
1428
|
+
>
|
|
1429
|
+
<vo-icon name="spark"></vo-icon><span>Ask AI</span>
|
|
1430
|
+
</button>
|
|
1431
|
+
}
|
|
1432
|
+
</div>
|
|
1433
|
+
|
|
1434
|
+
<div
|
|
1435
|
+
#body
|
|
1436
|
+
class="vo-rte-body"
|
|
1437
|
+
[class.vo-empty]="empty && !review"
|
|
1438
|
+
contenteditable="true"
|
|
1439
|
+
role="textbox"
|
|
1440
|
+
aria-multiline="true"
|
|
1441
|
+
[attr.aria-label]="label"
|
|
1442
|
+
[attr.aria-placeholder]="placeholder"
|
|
1443
|
+
[attr.data-placeholder]="placeholder"
|
|
1444
|
+
spellcheck="true"
|
|
1445
|
+
></div>
|
|
1446
|
+
|
|
1447
|
+
<div class="vo-rte-ft">
|
|
1448
|
+
<div class="vo-rte-idle" (mousedown)="keepFocus($event)">
|
|
1449
|
+
<span class="vo-rte-wc vo-num">{{ words === 1 ? '1 word' : words + ' words' }}</span>
|
|
1450
|
+
@if (ai !== false && hint) {
|
|
1451
|
+
<span class="vo-rte-hint">{{ hint }}</span>
|
|
1452
|
+
}
|
|
1453
|
+
<span class="vo-sp"></span>
|
|
1454
|
+
<button type="button" class="vo-ib vo-rte-un" aria-label="Undo" [attr.title]="'Undo · ' + undoKbd" [disabled]="!!review || !canUndo" (click)="doUndo($event)"><vo-icon name="undo"></vo-icon></button>
|
|
1455
|
+
<button type="button" class="vo-ib vo-rte-re" aria-label="Redo" [attr.title]="'Redo · ' + redoKbd" [disabled]="!!review || !canRedo" (click)="doRedo($event)"><vo-icon name="redo"></vo-icon></button>
|
|
1456
|
+
</div>
|
|
1457
|
+
<div class="vo-rte-rev" (mousedown)="keepFocus($event)">
|
|
1458
|
+
<span class="vo-rte-st">
|
|
1459
|
+
@if (review && !review.ready) {
|
|
1460
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
1461
|
+
<span class="vo-shim">{{ reviewLabel }}</span>
|
|
1462
|
+
} @else if (review) {
|
|
1463
|
+
<vo-icon name="spark"></vo-icon><span>Suggestion ready</span>
|
|
1464
|
+
}
|
|
1465
|
+
</span>
|
|
1466
|
+
<span class="vo-sp"></span>
|
|
1467
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-rte-no" (click)="finish(false, $event.isTrusted)">Discard<span class="vo-kbd">Esc</span></button>
|
|
1468
|
+
<button type="button" class="vo-pill vo-accent vo-sm vo-rte-ok" [disabled]="!review?.ready" (click)="finish(true, $event.isTrusted)">Accept<span class="vo-kbd">Tab</span></button>
|
|
1469
|
+
</div>
|
|
1470
|
+
</div>
|
|
1471
|
+
|
|
1472
|
+
@if (ai !== false) {
|
|
1473
|
+
<button
|
|
1474
|
+
#askEl
|
|
1475
|
+
type="button"
|
|
1476
|
+
class="vo-rte-ask"
|
|
1477
|
+
[class.vo-show]="bubble"
|
|
1478
|
+
tabindex="-1"
|
|
1479
|
+
aria-label="Ask AI about the selection"
|
|
1480
|
+
(mousedown)="$event.preventDefault()"
|
|
1481
|
+
(click)="onAskButton($event)"
|
|
1482
|
+
>
|
|
1483
|
+
<vo-icon name="spark"></vo-icon><span>Ask AI</span>
|
|
1484
|
+
</button>
|
|
1485
|
+
|
|
1486
|
+
<div
|
|
1487
|
+
#menuEl
|
|
1488
|
+
class="vo-pop vo-rte-menu"
|
|
1489
|
+
[class.vo-open]="!!job"
|
|
1490
|
+
role="menu"
|
|
1491
|
+
[attr.aria-labelledby]="uid + '-ph'"
|
|
1492
|
+
[attr.inert]="job ? null : ''"
|
|
1493
|
+
(keydown)="menuKey($event)"
|
|
1494
|
+
(mousedown)="$event.preventDefault()"
|
|
1495
|
+
>
|
|
1496
|
+
<div class="vo-ph" [id]="uid + '-ph'">{{ menuHeading }}</div>
|
|
1497
|
+
@for (a of items; track a.key) {
|
|
1498
|
+
<button
|
|
1499
|
+
type="button"
|
|
1500
|
+
class="vo-mi"
|
|
1501
|
+
role="menuitem"
|
|
1502
|
+
tabindex="-1"
|
|
1503
|
+
[attr.data-a]="a.key"
|
|
1504
|
+
[attr.aria-disabled]="a.off"
|
|
1505
|
+
(click)="onMenuItem(a, $event)"
|
|
1506
|
+
>
|
|
1507
|
+
@if (a.icon) { <vo-icon [name]="a.icon"></vo-icon> }
|
|
1508
|
+
<span>{{ a.label }}</span>
|
|
1509
|
+
</button>
|
|
1510
|
+
}
|
|
1511
|
+
</div>
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
<div
|
|
1515
|
+
#lnkEl
|
|
1516
|
+
class="vo-pop vo-rte-lnk"
|
|
1517
|
+
[class.vo-open]="!!lk"
|
|
1518
|
+
role="dialog"
|
|
1519
|
+
aria-label="Link"
|
|
1520
|
+
[attr.inert]="lk ? null : ''"
|
|
1521
|
+
(keydown)="lnkKey($event)"
|
|
1522
|
+
(focusout)="lnkBlur($event)"
|
|
1523
|
+
>
|
|
1524
|
+
<input
|
|
1525
|
+
#urlEl
|
|
1526
|
+
class="vo-rte-url"
|
|
1527
|
+
type="url"
|
|
1528
|
+
placeholder="Paste or type a link"
|
|
1529
|
+
aria-label="Link address"
|
|
1530
|
+
autocomplete="off"
|
|
1531
|
+
spellcheck="false"
|
|
1532
|
+
[value]="url"
|
|
1533
|
+
[attr.aria-invalid]="bad ? 'true' : null"
|
|
1534
|
+
(input)="onUrlInput($event)"
|
|
1535
|
+
/>
|
|
1536
|
+
<button type="button" class="vo-pill vo-accent vo-sm vo-rte-lok" (click)="applyLink('')">Apply</button>
|
|
1537
|
+
@if (hasHref && lk) {
|
|
1538
|
+
<button type="button" class="vo-ib vo-rte-lrm" aria-label="Remove link" title="Remove link" (click)="applyLink(null)"><vo-icon name="trash"></vo-icon></button>
|
|
1539
|
+
}
|
|
1540
|
+
</div>
|
|
1541
|
+
|
|
1542
|
+
<p class="vo-rte-live" aria-live="polite">{{ say }}</p>
|
|
1543
|
+
</div>
|
|
1544
|
+
`, isInline: true, styles: [".vo-rte{position:relative;width:100%;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);transition:box-shadow .32s;container:rte/inline-size;--vo-rte-q:var(--vo-muted);--vo-rte-q2:var(--vo-fg2)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}}:root[data-theme=dark] .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}.vo-rte-tb{display:flex;align-items:center;gap:2px;min-width:0;padding:7px var(--vo-s-2);box-shadow:inset 0 -1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-b{width:30px;height:30px;flex:none;display:grid;place-items:center;border-radius:var(--vo-r-sm);color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-rte-b:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-rte-b:is([aria-pressed=true],.vo-on){background:var(--vo-accent-bg);color:var(--vo-accent-fg)}.vo-rte-b:disabled,.vo-rte-ai:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-sep{width:1px;height:16px;margin:0 5px;flex:none;background:var(--vo-line)}.vo-rte-ai{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px 0 9px;flex:none;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-rte-ai .vo-i{color:var(--vo-accent-fg)}.vo-rte-ai[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-rte-ai:hover{background:var(--vo-row)}}.vo-rte-ai:disabled .vo-i{color:inherit}.vo-rte-body{position:relative;height:256px;overflow-y:auto;padding:var(--vo-s-4) 18px;outline:0;font-size:14px;line-height:1.65;color:var(--vo-fg);white-space:pre-wrap;overflow-wrap:break-word;caret-color:var(--vo-accent-fg);cursor:text}.vo-rte-body>*{margin:0;padding:0}.vo-rte-body>*+*{margin-top:6px}.vo-rte-body>*+h2{margin-top:14px}.vo-rte-body h2{font-size:14px;font-weight:500;line-height:1.5;color:var(--vo-fg)}.vo-rte-body :is(b,strong){font-weight:500}.vo-rte-body i{font-style:italic}.vo-rte-body a{color:var(--vo-accent-fg);text-decoration:underline;text-decoration-color:var(--vo-accent-mark);text-underline-offset:2px;cursor:text}.vo-rte-body code{font-family:var(--vo-mono);font-size:12.5px;padding:1px var(--vo-s-1);border-radius:5px;background:var(--vo-chip);color:var(--vo-fg)}.vo-rte-body :is(ul,ol){padding-left:22px}.vo-rte-body ul{list-style:disc}.vo-rte-body ol{list-style:decimal}.vo-rte-body li{padding-left:2px}.vo-rte-body li+li{margin-top:2px}.vo-rte-body li::marker{color:var(--vo-rte-q2)}.vo-rte-body blockquote{padding-left:14px;box-shadow:inset 2px 0 0 var(--vo-rte-q);color:var(--vo-rte-q2)}.vo-rte-body blockquote+blockquote{margin-top:0;padding-top:6px}.vo-rte-body.vo-empty:before{content:attr(data-placeholder);position:absolute;left:18px;right:18px;top:16px;color:var(--vo-rte-q);pointer-events:none}.vo-rte-old{color:var(--vo-rte-q);text-decoration:line-through;text-decoration-color:var(--vo-rte-q)}.vo-rte-new{color:var(--vo-accent-fg);background:var(--vo-sel);border-radius:3px}.vo-rte-old+.vo-rte-new{margin-left:.3em}.vo-rte-new .vo-w{animation:vo-rtew .4s var(--vo-ease) both}@keyframes vo-rtew{0%{opacity:0;filter:blur(3px)}to{opacity:1;filter:none}}::highlight(rte-pick){background-color:color-mix(in srgb,var(--vo-accent-mark) 24%,transparent)}.vo-rte-ft{display:grid;align-items:center;min-height:46px;padding:6px var(--vo-s-2) 6px 18px;box-shadow:inset 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-idle,.vo-rte-rev{grid-area:1/1;display:flex;align-items:center;gap:var(--vo-s-2);min-width:0;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s}.vo-rte-rev,.vo-rte[data-st=review] .vo-rte-idle{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s .35s}.vo-rte-rev{transform:translateY(4px)}.vo-rte[data-st=review] .vo-rte-idle{transform:translateY(-4px)}.vo-rte[data-st=review] .vo-rte-rev{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition-delay:0s}.vo-rte-wc,.vo-rte-hint{font-size:12px;color:var(--vo-rte-q);white-space:nowrap}.vo-rte-hint{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-hint:before{content:\"\\b7\";margin-right:var(--vo-s-2)}.vo-rte-idle .vo-ib{width:28px;height:28px;flex:none}.vo-rte-idle .vo-ib:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-st{display:flex;align-items:center;gap:7px;flex:0 1 auto;min-width:0;font-size:13px;color:var(--vo-rte-q2);white-space:nowrap}.vo-rte-st>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-st .vo-i{color:var(--vo-accent-fg)}.vo-rte-rev .vo-pill{flex:none}.vo-rte-rev .vo-pill.vo-ghost,.vo-rte-rev .vo-kbd,.vo-rte-menu .vo-ph{color:var(--vo-rte-q2)}@media (hover:hover) and (pointer:fine){.vo-rte-rev .vo-pill.vo-ghost:hover{color:var(--vo-fg)}}.vo-rte-menu{width:228px}.vo-rte-menu .vo-mi[aria-disabled=true],.vo-rte-menu .vo-mi[aria-disabled=true] .vo-i{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-rte-lnk{display:flex;align-items:center;gap:6px;width:304px;max-width:calc(100% - 12px);min-width:0;padding:6px}.vo-rte-url{flex:1;min-width:0;height:32px;padding:0 10px;border:0;border-radius:var(--vo-r-field);outline:0;background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);color:var(--vo-fg);font-size:13px}@supports (corner-shape:squircle){.vo-rte-url{corner-shape:squircle;border-radius:var(--vo-r-field-sq)}}.vo-rte-url::placeholder{color:var(--vo-rte-q)}.vo-rte-url:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-rte-url[aria-invalid=true]{box-shadow:inset 0 0 0 1px var(--vo-bad)}.vo-rte-lnk .vo-pill{flex:none}.vo-rte-lnk .vo-ib{width:30px;height:30px;flex:none}.vo-rte-ask{position:absolute;left:0;top:0;z-index:6;display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px 0 9px;border-radius:var(--vo-r-pill);background:var(--vo-raised);box-shadow:var(--vo-shadow-pop);font-size:12.5px;color:var(--vo-fg);white-space:nowrap;cursor:pointer;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .18s var(--vo-ease),transform .3s var(--vo-ease),visibility 0s .3s}.vo-rte-ask .vo-i{color:var(--vo-accent-fg)}@media (hover:hover) and (pointer:fine){.vo-rte-ask:hover{background:color-mix(in srgb,var(--vo-fg) 4%,var(--vo-raised))}}.vo-rte-ask.vo-show{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-rte-live{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container rte (max-width:520px){.vo-rte-hint{display:none}}@container rte (max-width:400px){.vo-rte-ai{width:30px;padding:0;justify-content:center}.vo-rte-ai span{display:none}.vo-rte-sep{margin:0 2px}.vo-rte-body{padding:14px}.vo-rte-body.vo-empty:before{left:14px;right:14px;top:14px}.vo-rte-ft{padding-left:14px}.vo-rte-rev .vo-kbd{display:none}}@container rte (max-width:330px){.vo-rte-tb{gap:0;padding:7px var(--vo-s-1)}.vo-rte-b{width:28px}}:root:not([data-style=soft]) .vo-rte-b:is([aria-pressed=true],.vo-on):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-accent-mark) 50%,transparent)}:root:not([data-style=soft]) .vo-rte-new:not(:where([data-style=soft],[data-style=soft] *)){background:var(--vo-accent-bg);box-shadow:inset 0 -1px 0 var(--vo-accent-mark)}.vo-pop{position:absolute;left:0;top:0;z-index:7;background:var(--vo-raised);border-radius:var(--vo-r-inner);box-shadow:var(--vo-shadow-pop);padding:5px;opacity:0;visibility:hidden;transform:translateY(4px) scale(.98);transform-origin:top left;transition:opacity .16s var(--vo-ease),transform .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-ph{padding:6px 10px 4px;font-size:11.5px;font-weight:500}.vo-mi{display:flex;align-items:center;gap:9px;width:100%;padding:7px 10px;border-radius:var(--vo-r-sm);font-size:13px;color:var(--vo-fg);cursor:pointer;text-align:left}.vo-mi .vo-i{color:var(--vo-fg2);flex:none}@media (hover:hover) and (pointer:fine){.vo-mi:hover:not([aria-disabled=true]){background:var(--vo-row)}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill:disabled{opacity:1;cursor:not-allowed;background:var(--vo-chip);color:var(--vo-dis)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{display:inline-flex;align-items:center;height:16px;padding:0 4px;border-radius:4px;background:color-mix(in srgb,var(--vo-fg) 8%,transparent);font-size:10.5px;font-weight:500;line-height:1}.vo-num{font-variant-numeric:tabular-nums}.vo-sp{flex:1;min-width:0}.vo-think{display:inline-flex;align-items:center;gap:3px;flex:none}.vo-think i{width:4px;height:4px;border-radius:50%;background:var(--vo-accent-fg);opacity:.4;animation:vo-thk 1s var(--vo-ease) infinite}.vo-think i:nth-child(2){animation-delay:.12s}.vo-think i:nth-child(3){animation-delay:.24s}.vo-think i:nth-child(4){animation-delay:.36s}@keyframes vo-thk{0%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.vo-shim{background:linear-gradient(90deg,var(--vo-rte-q2) 40%,var(--vo-fg) 50%,var(--vo-rte-q2) 60%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 1.4s linear infinite}@keyframes vo-shim{to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.vo-rte-new .vo-w,.vo-think i,.vo-shim,.vo-rte-idle,.vo-rte-rev,.vo-rte-ask,.vo-pop{animation:none!important;transition:none!important}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1545
|
+
}
|
|
1546
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichTextEditorComponent, decorators: [{
|
|
1547
|
+
type: Component,
|
|
1548
|
+
args: [{ selector: 'vo-rich-text-editor', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
1549
|
+
<div
|
|
1550
|
+
data-vo=""
|
|
1551
|
+
#root
|
|
1552
|
+
class="vo-rte"
|
|
1553
|
+
[attr.data-st]="review ? 'review' : 'edit'"
|
|
1554
|
+
(keydown)="onRootKey($event)"
|
|
1555
|
+
(pointerdown)="onRootPointerDown($event)"
|
|
1556
|
+
>
|
|
1557
|
+
<div
|
|
1558
|
+
#tb
|
|
1559
|
+
class="vo-rte-tb"
|
|
1560
|
+
role="toolbar"
|
|
1561
|
+
aria-label="Formatting"
|
|
1562
|
+
(mousedown)="keepFocus($event)"
|
|
1563
|
+
(keydown)="tbKey($event)"
|
|
1564
|
+
>
|
|
1565
|
+
@for (t of tools; track t.f; let i = $index) {
|
|
1566
|
+
@if (i === 5) {
|
|
1567
|
+
<span class="vo-rte-sep" aria-hidden="true"></span>
|
|
1568
|
+
}
|
|
1569
|
+
<button
|
|
1570
|
+
type="button"
|
|
1571
|
+
class="vo-rte-b"
|
|
1572
|
+
[class.vo-on]="t.f === 'a' && t.on && !review"
|
|
1573
|
+
[attr.data-f]="t.f"
|
|
1574
|
+
[attr.aria-label]="t.label"
|
|
1575
|
+
[attr.title]="t.label + ' · ' + t.kbd"
|
|
1576
|
+
[disabled]="!!review"
|
|
1577
|
+
[tabIndex]="focusTb === i ? 0 : -1"
|
|
1578
|
+
[attr.aria-haspopup]="t.f === 'a' ? 'dialog' : null"
|
|
1579
|
+
[attr.aria-expanded]="t.f === 'a' ? !!lk : null"
|
|
1580
|
+
[attr.aria-pressed]="t.f !== 'a' ? (!review && t.on) : null"
|
|
1581
|
+
(click)="apply(t.f, $event)"
|
|
1582
|
+
>
|
|
1583
|
+
<vo-icon [name]="t.icon" size="md"></vo-icon>
|
|
1584
|
+
</button>
|
|
1585
|
+
}
|
|
1586
|
+
<span class="vo-sp"></span>
|
|
1587
|
+
@if (ai !== false) {
|
|
1588
|
+
<button
|
|
1589
|
+
type="button"
|
|
1590
|
+
class="vo-rte-ai"
|
|
1591
|
+
aria-label="Ask AI"
|
|
1592
|
+
aria-haspopup="menu"
|
|
1593
|
+
[attr.aria-expanded]="!!job"
|
|
1594
|
+
[attr.title]="'Edit or write with AI · ' + aiKbd"
|
|
1595
|
+
[disabled]="!!review"
|
|
1596
|
+
[tabIndex]="focusTb === tools.length ? 0 : -1"
|
|
1597
|
+
(click)="onAiButton($event)"
|
|
1598
|
+
>
|
|
1599
|
+
<vo-icon name="spark"></vo-icon><span>Ask AI</span>
|
|
1600
|
+
</button>
|
|
1601
|
+
}
|
|
1602
|
+
</div>
|
|
1603
|
+
|
|
1604
|
+
<div
|
|
1605
|
+
#body
|
|
1606
|
+
class="vo-rte-body"
|
|
1607
|
+
[class.vo-empty]="empty && !review"
|
|
1608
|
+
contenteditable="true"
|
|
1609
|
+
role="textbox"
|
|
1610
|
+
aria-multiline="true"
|
|
1611
|
+
[attr.aria-label]="label"
|
|
1612
|
+
[attr.aria-placeholder]="placeholder"
|
|
1613
|
+
[attr.data-placeholder]="placeholder"
|
|
1614
|
+
spellcheck="true"
|
|
1615
|
+
></div>
|
|
1616
|
+
|
|
1617
|
+
<div class="vo-rte-ft">
|
|
1618
|
+
<div class="vo-rte-idle" (mousedown)="keepFocus($event)">
|
|
1619
|
+
<span class="vo-rte-wc vo-num">{{ words === 1 ? '1 word' : words + ' words' }}</span>
|
|
1620
|
+
@if (ai !== false && hint) {
|
|
1621
|
+
<span class="vo-rte-hint">{{ hint }}</span>
|
|
1622
|
+
}
|
|
1623
|
+
<span class="vo-sp"></span>
|
|
1624
|
+
<button type="button" class="vo-ib vo-rte-un" aria-label="Undo" [attr.title]="'Undo · ' + undoKbd" [disabled]="!!review || !canUndo" (click)="doUndo($event)"><vo-icon name="undo"></vo-icon></button>
|
|
1625
|
+
<button type="button" class="vo-ib vo-rte-re" aria-label="Redo" [attr.title]="'Redo · ' + redoKbd" [disabled]="!!review || !canRedo" (click)="doRedo($event)"><vo-icon name="redo"></vo-icon></button>
|
|
1626
|
+
</div>
|
|
1627
|
+
<div class="vo-rte-rev" (mousedown)="keepFocus($event)">
|
|
1628
|
+
<span class="vo-rte-st">
|
|
1629
|
+
@if (review && !review.ready) {
|
|
1630
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
1631
|
+
<span class="vo-shim">{{ reviewLabel }}</span>
|
|
1632
|
+
} @else if (review) {
|
|
1633
|
+
<vo-icon name="spark"></vo-icon><span>Suggestion ready</span>
|
|
1634
|
+
}
|
|
1635
|
+
</span>
|
|
1636
|
+
<span class="vo-sp"></span>
|
|
1637
|
+
<button type="button" class="vo-pill vo-ghost vo-sm vo-rte-no" (click)="finish(false, $event.isTrusted)">Discard<span class="vo-kbd">Esc</span></button>
|
|
1638
|
+
<button type="button" class="vo-pill vo-accent vo-sm vo-rte-ok" [disabled]="!review?.ready" (click)="finish(true, $event.isTrusted)">Accept<span class="vo-kbd">Tab</span></button>
|
|
1639
|
+
</div>
|
|
1640
|
+
</div>
|
|
1641
|
+
|
|
1642
|
+
@if (ai !== false) {
|
|
1643
|
+
<button
|
|
1644
|
+
#askEl
|
|
1645
|
+
type="button"
|
|
1646
|
+
class="vo-rte-ask"
|
|
1647
|
+
[class.vo-show]="bubble"
|
|
1648
|
+
tabindex="-1"
|
|
1649
|
+
aria-label="Ask AI about the selection"
|
|
1650
|
+
(mousedown)="$event.preventDefault()"
|
|
1651
|
+
(click)="onAskButton($event)"
|
|
1652
|
+
>
|
|
1653
|
+
<vo-icon name="spark"></vo-icon><span>Ask AI</span>
|
|
1654
|
+
</button>
|
|
1655
|
+
|
|
1656
|
+
<div
|
|
1657
|
+
#menuEl
|
|
1658
|
+
class="vo-pop vo-rte-menu"
|
|
1659
|
+
[class.vo-open]="!!job"
|
|
1660
|
+
role="menu"
|
|
1661
|
+
[attr.aria-labelledby]="uid + '-ph'"
|
|
1662
|
+
[attr.inert]="job ? null : ''"
|
|
1663
|
+
(keydown)="menuKey($event)"
|
|
1664
|
+
(mousedown)="$event.preventDefault()"
|
|
1665
|
+
>
|
|
1666
|
+
<div class="vo-ph" [id]="uid + '-ph'">{{ menuHeading }}</div>
|
|
1667
|
+
@for (a of items; track a.key) {
|
|
1668
|
+
<button
|
|
1669
|
+
type="button"
|
|
1670
|
+
class="vo-mi"
|
|
1671
|
+
role="menuitem"
|
|
1672
|
+
tabindex="-1"
|
|
1673
|
+
[attr.data-a]="a.key"
|
|
1674
|
+
[attr.aria-disabled]="a.off"
|
|
1675
|
+
(click)="onMenuItem(a, $event)"
|
|
1676
|
+
>
|
|
1677
|
+
@if (a.icon) { <vo-icon [name]="a.icon"></vo-icon> }
|
|
1678
|
+
<span>{{ a.label }}</span>
|
|
1679
|
+
</button>
|
|
1680
|
+
}
|
|
1681
|
+
</div>
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
<div
|
|
1685
|
+
#lnkEl
|
|
1686
|
+
class="vo-pop vo-rte-lnk"
|
|
1687
|
+
[class.vo-open]="!!lk"
|
|
1688
|
+
role="dialog"
|
|
1689
|
+
aria-label="Link"
|
|
1690
|
+
[attr.inert]="lk ? null : ''"
|
|
1691
|
+
(keydown)="lnkKey($event)"
|
|
1692
|
+
(focusout)="lnkBlur($event)"
|
|
1693
|
+
>
|
|
1694
|
+
<input
|
|
1695
|
+
#urlEl
|
|
1696
|
+
class="vo-rte-url"
|
|
1697
|
+
type="url"
|
|
1698
|
+
placeholder="Paste or type a link"
|
|
1699
|
+
aria-label="Link address"
|
|
1700
|
+
autocomplete="off"
|
|
1701
|
+
spellcheck="false"
|
|
1702
|
+
[value]="url"
|
|
1703
|
+
[attr.aria-invalid]="bad ? 'true' : null"
|
|
1704
|
+
(input)="onUrlInput($event)"
|
|
1705
|
+
/>
|
|
1706
|
+
<button type="button" class="vo-pill vo-accent vo-sm vo-rte-lok" (click)="applyLink('')">Apply</button>
|
|
1707
|
+
@if (hasHref && lk) {
|
|
1708
|
+
<button type="button" class="vo-ib vo-rte-lrm" aria-label="Remove link" title="Remove link" (click)="applyLink(null)"><vo-icon name="trash"></vo-icon></button>
|
|
1709
|
+
}
|
|
1710
|
+
</div>
|
|
1711
|
+
|
|
1712
|
+
<p class="vo-rte-live" aria-live="polite">{{ say }}</p>
|
|
1713
|
+
</div>
|
|
1714
|
+
`, styles: [".vo-rte{position:relative;width:100%;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);transition:box-shadow .32s;container:rte/inline-size;--vo-rte-q:var(--vo-muted);--vo-rte-q2:var(--vo-fg2)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}}:root[data-theme=dark] .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}.vo-rte-tb{display:flex;align-items:center;gap:2px;min-width:0;padding:7px var(--vo-s-2);box-shadow:inset 0 -1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-b{width:30px;height:30px;flex:none;display:grid;place-items:center;border-radius:var(--vo-r-sm);color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-rte-b:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-rte-b:is([aria-pressed=true],.vo-on){background:var(--vo-accent-bg);color:var(--vo-accent-fg)}.vo-rte-b:disabled,.vo-rte-ai:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-sep{width:1px;height:16px;margin:0 5px;flex:none;background:var(--vo-line)}.vo-rte-ai{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px 0 9px;flex:none;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-rte-ai .vo-i{color:var(--vo-accent-fg)}.vo-rte-ai[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-rte-ai:hover{background:var(--vo-row)}}.vo-rte-ai:disabled .vo-i{color:inherit}.vo-rte-body{position:relative;height:256px;overflow-y:auto;padding:var(--vo-s-4) 18px;outline:0;font-size:14px;line-height:1.65;color:var(--vo-fg);white-space:pre-wrap;overflow-wrap:break-word;caret-color:var(--vo-accent-fg);cursor:text}.vo-rte-body>*{margin:0;padding:0}.vo-rte-body>*+*{margin-top:6px}.vo-rte-body>*+h2{margin-top:14px}.vo-rte-body h2{font-size:14px;font-weight:500;line-height:1.5;color:var(--vo-fg)}.vo-rte-body :is(b,strong){font-weight:500}.vo-rte-body i{font-style:italic}.vo-rte-body a{color:var(--vo-accent-fg);text-decoration:underline;text-decoration-color:var(--vo-accent-mark);text-underline-offset:2px;cursor:text}.vo-rte-body code{font-family:var(--vo-mono);font-size:12.5px;padding:1px var(--vo-s-1);border-radius:5px;background:var(--vo-chip);color:var(--vo-fg)}.vo-rte-body :is(ul,ol){padding-left:22px}.vo-rte-body ul{list-style:disc}.vo-rte-body ol{list-style:decimal}.vo-rte-body li{padding-left:2px}.vo-rte-body li+li{margin-top:2px}.vo-rte-body li::marker{color:var(--vo-rte-q2)}.vo-rte-body blockquote{padding-left:14px;box-shadow:inset 2px 0 0 var(--vo-rte-q);color:var(--vo-rte-q2)}.vo-rte-body blockquote+blockquote{margin-top:0;padding-top:6px}.vo-rte-body.vo-empty:before{content:attr(data-placeholder);position:absolute;left:18px;right:18px;top:16px;color:var(--vo-rte-q);pointer-events:none}.vo-rte-old{color:var(--vo-rte-q);text-decoration:line-through;text-decoration-color:var(--vo-rte-q)}.vo-rte-new{color:var(--vo-accent-fg);background:var(--vo-sel);border-radius:3px}.vo-rte-old+.vo-rte-new{margin-left:.3em}.vo-rte-new .vo-w{animation:vo-rtew .4s var(--vo-ease) both}@keyframes vo-rtew{0%{opacity:0;filter:blur(3px)}to{opacity:1;filter:none}}::highlight(rte-pick){background-color:color-mix(in srgb,var(--vo-accent-mark) 24%,transparent)}.vo-rte-ft{display:grid;align-items:center;min-height:46px;padding:6px var(--vo-s-2) 6px 18px;box-shadow:inset 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-idle,.vo-rte-rev{grid-area:1/1;display:flex;align-items:center;gap:var(--vo-s-2);min-width:0;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s}.vo-rte-rev,.vo-rte[data-st=review] .vo-rte-idle{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s .35s}.vo-rte-rev{transform:translateY(4px)}.vo-rte[data-st=review] .vo-rte-idle{transform:translateY(-4px)}.vo-rte[data-st=review] .vo-rte-rev{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition-delay:0s}.vo-rte-wc,.vo-rte-hint{font-size:12px;color:var(--vo-rte-q);white-space:nowrap}.vo-rte-hint{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-hint:before{content:\"\\b7\";margin-right:var(--vo-s-2)}.vo-rte-idle .vo-ib{width:28px;height:28px;flex:none}.vo-rte-idle .vo-ib:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-st{display:flex;align-items:center;gap:7px;flex:0 1 auto;min-width:0;font-size:13px;color:var(--vo-rte-q2);white-space:nowrap}.vo-rte-st>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-st .vo-i{color:var(--vo-accent-fg)}.vo-rte-rev .vo-pill{flex:none}.vo-rte-rev .vo-pill.vo-ghost,.vo-rte-rev .vo-kbd,.vo-rte-menu .vo-ph{color:var(--vo-rte-q2)}@media (hover:hover) and (pointer:fine){.vo-rte-rev .vo-pill.vo-ghost:hover{color:var(--vo-fg)}}.vo-rte-menu{width:228px}.vo-rte-menu .vo-mi[aria-disabled=true],.vo-rte-menu .vo-mi[aria-disabled=true] .vo-i{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-rte-lnk{display:flex;align-items:center;gap:6px;width:304px;max-width:calc(100% - 12px);min-width:0;padding:6px}.vo-rte-url{flex:1;min-width:0;height:32px;padding:0 10px;border:0;border-radius:var(--vo-r-field);outline:0;background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);color:var(--vo-fg);font-size:13px}@supports (corner-shape:squircle){.vo-rte-url{corner-shape:squircle;border-radius:var(--vo-r-field-sq)}}.vo-rte-url::placeholder{color:var(--vo-rte-q)}.vo-rte-url:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-rte-url[aria-invalid=true]{box-shadow:inset 0 0 0 1px var(--vo-bad)}.vo-rte-lnk .vo-pill{flex:none}.vo-rte-lnk .vo-ib{width:30px;height:30px;flex:none}.vo-rte-ask{position:absolute;left:0;top:0;z-index:6;display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px 0 9px;border-radius:var(--vo-r-pill);background:var(--vo-raised);box-shadow:var(--vo-shadow-pop);font-size:12.5px;color:var(--vo-fg);white-space:nowrap;cursor:pointer;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .18s var(--vo-ease),transform .3s var(--vo-ease),visibility 0s .3s}.vo-rte-ask .vo-i{color:var(--vo-accent-fg)}@media (hover:hover) and (pointer:fine){.vo-rte-ask:hover{background:color-mix(in srgb,var(--vo-fg) 4%,var(--vo-raised))}}.vo-rte-ask.vo-show{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-rte-live{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container rte (max-width:520px){.vo-rte-hint{display:none}}@container rte (max-width:400px){.vo-rte-ai{width:30px;padding:0;justify-content:center}.vo-rte-ai span{display:none}.vo-rte-sep{margin:0 2px}.vo-rte-body{padding:14px}.vo-rte-body.vo-empty:before{left:14px;right:14px;top:14px}.vo-rte-ft{padding-left:14px}.vo-rte-rev .vo-kbd{display:none}}@container rte (max-width:330px){.vo-rte-tb{gap:0;padding:7px var(--vo-s-1)}.vo-rte-b{width:28px}}:root:not([data-style=soft]) .vo-rte-b:is([aria-pressed=true],.vo-on):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-accent-mark) 50%,transparent)}:root:not([data-style=soft]) .vo-rte-new:not(:where([data-style=soft],[data-style=soft] *)){background:var(--vo-accent-bg);box-shadow:inset 0 -1px 0 var(--vo-accent-mark)}.vo-pop{position:absolute;left:0;top:0;z-index:7;background:var(--vo-raised);border-radius:var(--vo-r-inner);box-shadow:var(--vo-shadow-pop);padding:5px;opacity:0;visibility:hidden;transform:translateY(4px) scale(.98);transform-origin:top left;transition:opacity .16s var(--vo-ease),transform .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-ph{padding:6px 10px 4px;font-size:11.5px;font-weight:500}.vo-mi{display:flex;align-items:center;gap:9px;width:100%;padding:7px 10px;border-radius:var(--vo-r-sm);font-size:13px;color:var(--vo-fg);cursor:pointer;text-align:left}.vo-mi .vo-i{color:var(--vo-fg2);flex:none}@media (hover:hover) and (pointer:fine){.vo-mi:hover:not([aria-disabled=true]){background:var(--vo-row)}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill:disabled{opacity:1;cursor:not-allowed;background:var(--vo-chip);color:var(--vo-dis)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{display:inline-flex;align-items:center;height:16px;padding:0 4px;border-radius:4px;background:color-mix(in srgb,var(--vo-fg) 8%,transparent);font-size:10.5px;font-weight:500;line-height:1}.vo-num{font-variant-numeric:tabular-nums}.vo-sp{flex:1;min-width:0}.vo-think{display:inline-flex;align-items:center;gap:3px;flex:none}.vo-think i{width:4px;height:4px;border-radius:50%;background:var(--vo-accent-fg);opacity:.4;animation:vo-thk 1s var(--vo-ease) infinite}.vo-think i:nth-child(2){animation-delay:.12s}.vo-think i:nth-child(3){animation-delay:.24s}.vo-think i:nth-child(4){animation-delay:.36s}@keyframes vo-thk{0%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.vo-shim{background:linear-gradient(90deg,var(--vo-rte-q2) 40%,var(--vo-fg) 50%,var(--vo-rte-q2) 60%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 1.4s linear infinite}@keyframes vo-shim{to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.vo-rte-new .vo-w,.vo-think i,.vo-shim,.vo-rte-idle,.vo-rte-rev,.vo-rte-ask,.vo-pop{animation:none!important;transition:none!important}}\n"] }]
|
|
1715
|
+
}], propDecorators: { value: [{
|
|
1716
|
+
type: Input
|
|
1717
|
+
}], defaultValue: [{
|
|
1718
|
+
type: Input
|
|
1719
|
+
}], placeholder: [{
|
|
1720
|
+
type: Input
|
|
1721
|
+
}], label: [{
|
|
1722
|
+
type: Input
|
|
1723
|
+
}], hint: [{
|
|
1724
|
+
type: Input
|
|
1725
|
+
}], ai: [{
|
|
1726
|
+
type: Input
|
|
1727
|
+
}], aiActions: [{
|
|
1728
|
+
type: Input
|
|
1729
|
+
}], valueChange: [{
|
|
1730
|
+
type: Output
|
|
1731
|
+
}], suggestion: [{
|
|
1732
|
+
type: Output
|
|
1733
|
+
}], rootRef: [{
|
|
1734
|
+
type: ViewChild,
|
|
1735
|
+
args: ['root']
|
|
1736
|
+
}], tbRef: [{
|
|
1737
|
+
type: ViewChild,
|
|
1738
|
+
args: ['tb']
|
|
1739
|
+
}], bodyRef: [{
|
|
1740
|
+
type: ViewChild,
|
|
1741
|
+
args: ['body']
|
|
1742
|
+
}], askRef: [{
|
|
1743
|
+
type: ViewChild,
|
|
1744
|
+
args: ['askEl']
|
|
1745
|
+
}], menuRef: [{
|
|
1746
|
+
type: ViewChild,
|
|
1747
|
+
args: ['menuEl']
|
|
1748
|
+
}], lnkRef: [{
|
|
1749
|
+
type: ViewChild,
|
|
1750
|
+
args: ['lnkEl']
|
|
1751
|
+
}], urlRef: [{
|
|
1752
|
+
type: ViewChild,
|
|
1753
|
+
args: ['urlEl']
|
|
1754
|
+
}] } });
|
|
1755
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9yaWNoLXRleHQtZWRpdG9yL3JpY2gtdGV4dC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHdFQUF3RTtBQUN4RSxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsb0ZBQW9GO0FBQ3BGLEVBQUU7QUFDRiw4RUFBOEU7QUFDOUUsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsbURBQW1EO0FBQ25ELDhFQUE4RTtBQUU5RSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBcUN0RSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztBQUNsQyxNQUFNLEtBQUssR0FBRyx3SkFBd0osQ0FBQztBQUN2SyxNQUFNLElBQUksR0FBRyx5SkFBeUosQ0FBQztBQUN2SyxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdILE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLEdB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sQ0FBQyxDQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sQ0FBQyxFQUFVLElBQUksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hNLElBQUksQ0FBQyxDQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENB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RyxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDckcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdkUsQ0FBQztJQUVELHNCQUFzQjtJQUNkLElBQUksS0FBSyxNQUFNLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZNLEdBQUc7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUNySyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUN6RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxHQUFHLENBQUMsQ0FBUyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hDLElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDL0MsTUFBTSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQsb0JBQW9CO0lBQ1osSUFBSTtRQUNWLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVztnQkFBRSxTQUFTO1lBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUFDLFNBQVM7WUFBQyxDQUFDO1lBQy9DLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXO2dCQUFFLFNBQVM7WUFDOUIsU0FBUyxDQUFDO2dCQUNSLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7Z0JBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUUsRUFBVyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQztvQkFBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQUMsQ0FBQztnQkFDeEcsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxFQUFjLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLElBQUssRUFBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFBRSxNQUFNO2dCQUNsSixFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7WUFBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxXQUFXO2dCQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU07Z0JBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7O2dCQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ3hPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7UUFDN0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBQ08sT0FBTyxDQUFDLElBQXNCO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQUMsSUFBSSxJQUFJLEdBQXVCLElBQUksQ0FBQztRQUNwRixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUM7b0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBQyxDQUFDO2lCQUNySixDQUFDO2dCQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFDTyxNQUFNLEtBQXVCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixLQUFLO1FBQ1gsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFFLENBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDNUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFFLENBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLENBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BLLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFRCxrQkFBa0I7SUFDVixLQUFLLENBQUMsSUFBVSxFQUFFLElBQWE7UUFDckMsTUFBTSxHQUFHLEdBQTRDLEVBQUUsQ0FBQztRQUFDLElBQUksR0FBRyxHQUFpRCxJQUFJLENBQUM7UUFDdEgsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFVLEVBQUUsQ0FBUyxFQUFFLEdBQVksRUFBRSxLQUEwQixFQUFFLEVBQUU7WUFDL0UsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxDQUFDLEdBQUksQ0FBVSxDQUFDLElBQUksQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsSUFBSTt3QkFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLHlDQUF5QyxDQUFDLElBQUksQ0FBRSxJQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUFFLFNBQVM7b0JBQ2hJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNwRCxJQUFJLENBQUM7NEJBQUUsR0FBRyxHQUFHLElBQUksQ0FBQzt3QkFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUFFLE9BQU87d0JBQy9DLElBQUksQ0FBQyxHQUFHOzRCQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxHQUFTLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzRCQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7NEJBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDOzRCQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFBQyxDQUFDO3dCQUM1TCxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDO29CQUFFLFNBQVM7Z0JBQy9CLE1BQU0sRUFBRSxHQUFHLENBQVksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztnQkFDekMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztvQkFBRSxTQUFTO2dCQUNuRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNELElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7b0JBQUMsU0FBUztnQkFBQyxDQUFDO2dCQUMxQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEssR0FBRyxHQUFHLElBQUksQ0FBQztvQkFBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNuQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDekMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGlEQUFpRCxDQUFDO3dCQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ3JLLEdBQUcsR0FBRyxJQUFJLENBQUM7b0JBQUMsU0FBUztnQkFDdkIsQ0FBQztnQkFDRCxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQUUsSUFBYSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEgsSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0ksSUFBSSxFQUFFLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9FLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELElBQUksRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQUMsSUFBSSxDQUFDO3dCQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLElBQUk7WUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFBQyxJQUFJLENBQWMsQ0FBQztnQkFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQWlCLENBQUM7b0JBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0osSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLENBQUM7WUFDdEksQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUNPLEtBQUssQ0FBQyxDQUFTLElBQVksT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdE4sS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkgsb0JBQW9CO0lBQ1osT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLEdBQVk7UUFDekIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztRQUN6SCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHO2dCQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUFDLENBQUM7UUFDdE4sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLEtBQUssQ0FBQyxHQUFtQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hPLE9BQU8sQ0FBQyxJQUFZLEVBQUUsR0FBa0IsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEosSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2TCxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3SixJQUFJLENBQUMsSUFBWTtRQUNmLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDekgsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNKLENBQUM7SUFFRCxrQkFBa0I7SUFDVixLQUFLLEtBQUssTUFBTSxHQUFHLEdBQXFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQWlCLENBQUMsRUFBRSxDQUFDO1FBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNSLEdBQUcsQ0FBQyxFQUFVLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0gsT0FBTyxDQUFDLENBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xLLEdBQUcsQ0FBQyxHQUFXLEVBQUUsQ0FBUztRQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFD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LE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQUUsU0FBUztnQkFDOUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFTLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxDQUFDO1FBQ25LLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFDTyxHQUFHLENBQUMsQ0FBUztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxDQUFDO1FBQ3RKLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoSSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFrQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDL0csSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMzTCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEgsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDZixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkksQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDdEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUNPLE1BQU0sQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUNqQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUcsQ0FBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDN0gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUNPLFdBQVcsQ0FBQyxLQUFhLEVBQUUsQ0FBUztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0csTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNILElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFrQixFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FB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QUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlKLE1BQU07UUFDSixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDL0YsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sS0FBYSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFM0UscURBQXFEO0lBQzdDLGFBQWEsQ0FBQyxDQUFhO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssYUFBYTtnQkFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7O2dCQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3ZJLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssWUFBWTtnQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUFNLElBQUksQ0FBQyxLQUFLLGNBQWM7Z0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3RKLElBQUksQ0FBQyxLQUFLLGlCQUFpQixJQUFJLENBQUMsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDckcsSUFBSSxDQUFDLEtBQUssaUJBQWlCLElBQUksQ0FBQyxLQUFLLGdCQUFnQixJQUFJLENBQUMsS0FBSyxjQUFjLElBQUksQ0FBQyxLQUFLLGFBQWE7WUFBRSxPQUFPO1FBQzdHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUM5SSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDM0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDdEssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsS0FBSyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDN0gsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFlB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RztZQUFFLE9BQU87UUFDckIsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5RyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDdEwsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0wsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUFDLEdBQUcsRUFBRSxDQUFDO1FBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFNBQVMsS0FBSyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELEtBQUssS0FBSyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEgsS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILElBQUksQ0FBQyxFQUFVLElBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVILEtBQUs7UUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JOLENBQUM7SUFDRCxNQUFNLENBQUMsQ0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLENBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUssSUFBSSxDQUFDLENBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLFlBQVksQ0FBQyxJQUFJLENB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TUFBTSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBZSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQWMsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFD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QUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNILEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMvRSxDQUFDO0lBQ08sSUFBSSxDQUFDLENBQWdCO1FBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUUsR0FBMkQsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3SCxNQUFNLEVBQUUsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFFLE1BQTBELENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0gsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUM5RSxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTyxVQUFVLENBQUMsQ0FBVTtRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLFlBQVksRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFD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V0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25LLFFBQVEsQ0FBQyxHQUFvRDtRQUMzRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLO1lBQUUsT0FBTztRQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3RCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1SSxDQUFDO0lBQ0QsU0FBUyxDQUFDLElBQWE7UUFDckIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0MsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFjLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQUMsQ0FBQzthQUMxSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBZ0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFrQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxFQUFFLEdBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFvRCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2TSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLENBQUM7YUFDOUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLENBQUM7YUFDN0csSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO0lBQ3hRLENBQUM7SUFDRCxVQUFVLENBQUMsQ0FBZ0MsRUFBRSxDQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO1FBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakcsSUFBSSxDQUFDLENBQVksSUFBUyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSSxHQUFHLENBQUMsR0FBVyxFQUFFLElBQWE7UUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTztRQUNsRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ2xMLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO1FBQ2hDLElBQUksSUFBSSxLQUFLLEtBQUs7WUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUN0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1FBQ25DLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3pGLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDL0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvSixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssd0JBQXdCLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUk7WUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN4SCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFLENBQUM7b0JBQ3RELE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDO29CQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFO3dCQUFFLE9BQU87b0JBQ3RELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O3dCQUNyQixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7NEJBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUU7Z0NBQUUsT0FBTzs0QkFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFBQyxDQUFDO2dCQUM3SSxDQUFDOztvQkFBTSxJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRTs0QkFBRSxPQUFPO3dCQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFBQyxDQUFDO1lBQ3pGLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFO29CQUFFLE9BQU87Z0JBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLENBQUM7WUFDdkUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEVBQUU7Z0JBQUUsT0FBTztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQUMsT0FBTztZQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLHNEQUFzRCxDQUFDLENBQUM7UUFDNUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBYSxFQUFFLElBQWE7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUM5RSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSztZQUFFLE9BQU87UUFDeEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUk7WUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7O1lBQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUk7WUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixRQUFRLENBQUMsSUFBYSxFQUFFLEdBQUcsR0FBRyxLQUFLO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUU7WUFBRSxPQUFPO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUgscUJBQXFCLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakosQ0FBQztJQUNELFNBQVMsQ0FBQyxJQUFhO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDbEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBYyxjQUFjLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUFDLENBQUM7YUFDMUksSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ08sS0FBSyxDQUFDLENBQVMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFRLFNBQVMsQ0FBQyxJQUFtQjtRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ3RELElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQUMsT0FBTztZQUFDLENBQUM7WUFBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUM3SixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEUsQ0FBQztJQUNELFVBQVUsQ0FBQyxDQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsTUFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxDQUFDLENBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQUMsQ0FBQztTQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFBQyxDQUFDLENBQUMsQ0FBQztJQUN6TyxPQUFPLENBQUMsQ0FBYSxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFxQixDQUFDO1FBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakosNEJBQTRCO0lBQ3BCLFNBQVMsQ0FBQyxDQUFnQjtRQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUFDLE9BQU8sSUFBSSxDQUFDO1lBQUMsQ0FBQztZQUNqSyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFBQyxPQUFPLElBQUksQ0FBQztZQUFDLENBQUM7WUFDeEssT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxHQUFHO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQztRQUFDLENBQUM7UUFDaE4sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFBQyxPQUFPLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDOUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsU0FBUyxDQUFDLENBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQWMsQ0FBQyxFQUFFLENBQUM7UUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hMLGlCQUFpQixDQUFDLENBQWUsSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztRQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJGLGtEQUFrRDtJQUNsRCxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUIsT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLE9BQU8sQ0FBQyxJQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLENBQVM7UUFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckYsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE9BQU8sSUFBSSxDQUFDO0lBQzFILENBQUM7SUFDRCxRQUFRLENBQUMsQ0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxPQUFPLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLENBQWlCLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssTUFBTTtRQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7O1FBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUssTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxDQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOytHQWxTakIsdUJBQXVCO21HQUF2Qix1QkFBdUIsdzRCQXpLeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzS1QseTBWQXZLUyxlQUFlOzs0RkEwS2QsdUJBQXVCO2tCQTlLbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZUFBZSxDQUFDLFlBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0tUOzhCQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFRyxFQUFFO3NCQUFWLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRW9CLE9BQU87c0JBQWpDLFNBQVM7dUJBQUMsTUFBTTtnQkFDUSxLQUFLO3NCQUE3QixTQUFTO3VCQUFDLElBQUk7Z0JBQ1ksT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNO2dCQUNXLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsT0FBTztnQkFDVyxPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1MsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxPQUFPO2dCQUNVLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3JpY2gtdGV4dC1lZGl0b3IvcmljaC10ZXh0LWVkaXRvci5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9yaWNoLXRleHQtZWRpdG9yL1JpY2hUZXh0RWRpdG9yLnRzeFxuLy8gKGVuZ2luZSBmcm9tIGZyYW1ld29yay92YW5pbGxhL3JpY2gtdGV4dC1lZGl0b3IvcmljaC10ZXh0LWVkaXRvci5qcykuXG4vL1xuLy8gQSBtaW5pbWFsIGVkaXRvciBmb3IgYSBkcmFmdCBhbiBhZ2VudCBoZWxwcyB3aXRoOiBhIGZvcm1hdHRpbmcgdG9vbGJhciwgYVxuLy8gbmF0aXZlIGNvbnRlbnRlZGl0YWJsZSBib2R5LCBhbmQgYSBxdWlldCBmb290IHdpdGggdGhlIHdvcmQgY291bnQgYW5kIHVuZG8uXG4vLyBTZWxlY3QgdGV4dCBhbmQgcHJlc3MgQXNrIEFJIChvciBNb2QrSiwgb3IgdHlwZSAvIG9uIGEgbmV3IGxpbmUpLCBhbmQgYVxuLy8gc3VnZ2VzdGlvbiBzdHJlYW1zIGluIGJlc2lkZSB0aGUgdGV4dCDigJQgdGhlIG9sZCB3b3JkcyBzdHJ1Y2sgdGhyb3VnaCwgdGhlIG5ld1xuLy8gb25lcyBhcnJpdmluZyB3b3JkIGJ5IHdvcmQg4oCUIHRvIGFjY2VwdCB3aXRoIFRhYi9FbnRlciBvciBkaXNjYXJkIHdpdGggRXNjYXBlLlxuLy9cbi8vIFRoZSBlZGl0aW5nIGVuZ2luZSBpcyBwb3J0ZWQgdmVyYmF0aW0gZnJvbSB0aGUgUmVhY3QgYGNyZWF0ZUVuZ2luZWAgaW50byB0aGVcbi8vIGBSdGVFbmdpbmVgIGNsYXNzIGJlbG93OyB0aGUgY29tcG9uZW50IGRyaXZlcyBhIG5hdGl2ZSBjb250ZW50ZWRpdGFibGUgZGl2IHZpYVxuLy8gQFZpZXdDaGlsZC9FbGVtZW50UmVmIGV4YWN0bHkgYXMgdGhlIFJlYWN0IGNvZGUgZHJpdmVzIGl0cyBgZWRgIHJlZi4gU2V0dXAgaW5cbi8vIG5nQWZ0ZXJWaWV3SW5pdCwgY2xlYW51cCBpbiBuZ09uRGVzdHJveS4gUmVkdWNlZCBtb3Rpb24gdmlhIFJlZHVjZWRNb3Rpb25TZXJ2aWNlLlxuLy9cbi8vIEljb24gc3Vic3RpdHV0aW9ucyAodGhlIHNoYXJlZCBBbmd1bGFyIGljb24gc2V0IGhhcyBubyBoZWFkaW5nL2JvbGQvaXRhbGljL1xuLy8gY29kZS9saW5rL2xpc3QvcXVvdGUvd2FuZCBnbHlwaHMsIHNvIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBhcmUgdXNlZCk6XG4vLyAgIGhlYWRpbmcgLT4gZmlsZS10ZXh0ICAgYm9sZCAtPiBlZGl0ICAgICAgaXRhbGljIC0+IHByICAgICBjb2RlIC0+IHRlcm1cbi8vICAgbGluayAgICAtPiBleHQgICAgICAgICBidWxsZXRlZCBsaXN0IC0+IG1vcmUgICBudW1iZXJlZCBsaXN0IC0+IG1vcmVcbi8vICAgcXVvdGUgICAtPiBjb21tZW50ICAgICB3YW5kIChJbXByb3ZlKSAtPiBzcGFya1xuLy8gVGhlIHJlbWFpbmluZyBpY29ucyAoc3BhcmssIG1pbnVzLCBjaGVjaywgZWRpdCwgdW5kbywgcmVkbywgdHJhc2gpIG1hcCAxOjEuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBBIGZvcm1hdHRpbmcgY29tbWFuZCwgYXMgdGhlIHRvb2xiYXIgYW5kIHRoZSBzaG9ydGN1dHMgYXBwbHkgaXQuIGBwYCB0dXJucyBsaW5lcyBiYWNrIGludG8gcGxhaW4gcGFyYWdyYXBocyAqL1xuZXhwb3J0IHR5cGUgUmljaFRleHRGb3JtYXQgPSAnaDInIHwgJ2InIHwgJ2knIHwgJ2NvZGUnIHwgJ3VsJyB8ICdvbCcgfCAncXVvdGUnIHwgJ3AnO1xuXG4vKiogQW4gaXRlbSBpbiB0aGUgQUkgbWVudSAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEFpQWN0aW9uIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb24/OiBWb0ljb25OYW1lO1xuICAvKiogYHN3YXBgICh0aGUgZGVmYXVsdCkgcmVwbGFjZXMgdGhlIHNlbGVjdGlvbiBvciB0aGUgY2FyZXQncyBwYXJhZ3JhcGg7IGBhZGRgIHdyaXRlcyBvbiBhZnRlciBpdCAqL1xuICBraW5kPzogJ3N3YXAnIHwgJ2FkZCc7XG59XG5cbi8qKiBXaGF0IHRoZSBBSSBpcyBhc2tlZCB0byBkby4gYHRleHRgIGlzIHdoYXQgaXQgYWN0cyBvbiAoZW1wdHkgZm9yIGFuIGBhZGRgKSwgYGJlZm9yZWAvYGFmdGVyYCB0aGUgdGV4dCBhcm91bmQgaXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRBaVJlcXVlc3Qge1xuICBhY3Rpb246IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBiZWZvcmU6IHN0cmluZztcbiAgYWZ0ZXI6IHN0cmluZztcbiAgZG9jdW1lbnQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFdyaXRlcyBhIHN1Z2dlc3Rpb246IGEgc3RyaW5nLCBhIHByb21pc2Ugb2Ygb25lLCBvciBhbiBhc3luYyBpdGVyYWJsZSBvZiBjaHVua3MgdG8gc3RyZWFtIGl0IGluICovXG5leHBvcnQgdHlwZSBSaWNoVGV4dEFpID0gKHJlcXVlc3Q6IFJpY2hUZXh0QWlSZXF1ZXN0KSA9PiBBc3luY0l0ZXJhYmxlPHN0cmluZz4gfCBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmc7XG5cbi8qKiBUaGUgcmVzdWx0IHJlcG9ydGVkIHdoZW4gYSBzdWdnZXN0aW9uIGlzIGFjY2VwdGVkIG9yIGRpc2NhcmRlZCAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFN1Z2dlc3Rpb25SZXN1bHQge1xuICBhY3Rpb246IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBhY2NlcHRlZDogYm9vbGVhbjtcbn1cblxudHlwZSBSYW5nZTIgPSB7IHM6IG51bWJlcjsgZTogbnVtYmVyIH07XG50eXBlIExpbmUgPSB7IHQ6IHN0cmluZzsgZnJhZzogRG9jdW1lbnRGcmFnbWVudDsgbGVuOiBudW1iZXIgfTtcblxuY29uc3QgTEVBRiA9ICdwLGgyLGJsb2NrcXVvdGUsbGknO1xuY29uc3QgQkxPQ0sgPSAvXihQfERJVnxIWzEtNl18TEl8QkxPQ0tRVU9URXxQUkV8VFJ8RFR8RER8U0VDVElPTnxBUlRJQ0xFfEhFQURFUnxGT09URVJ8QVNJREV8TUFJTnxOQVZ8RklHVVJFfEZJR0NBUFRJT058VUx8T0x8REx8VEFCTEV8VEJPRFl8VEhFQUR8VEZPT1R8QUREUkVTU3xIUikkLztcbmNvbnN0IFNLSVAgPSAvXihTQ1JJUFR8U1RZTEV8VEVNUExBVEV8SEVBRHxNRVRBfExJTkt8VElUTEV8SUZSQU1FfE9CSkVDVHxFTUJFRHxTVkd8TUFUSHxJTUd8UElDVFVSRXxWSURFT3xBVURJT3xDQU5WQVN8Tk9TQ1JJUFR8QlVUVE9OfElOUFVUfFNFTEVDVHxURVhUQVJFQXxPUFRJT04pJC87XG5jb25zdCBpc01hYyA9ICgpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIC9NYWN8aVAoaG9uZXxhZHxvZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtIHx8IG5hdmlnYXRvci51c2VyQWdlbnQpO1xuY29uc3Qgc2FmZVVybCA9IChoOiBzdHJpbmcgfCBudWxsKSA9PiB7IGNvbnN0IHYgPSAoaCB8fCAnJykudHJpbSgpOyByZXR1cm4gL14oaHR0cHM/OlxcL1xcL3xtYWlsdG86KS9pLnRlc3QodikgPyB2IDogbnVsbDsgfTtcblxuaW50ZXJmYWNlIEhvb2tzIHsgY2hhbmdlPzogKCkgPT4gdm9pZDsgc2VsZWN0PzogKCkgPT4gdm9pZDsgaW5wdXQ/OiAoZTogSW5wdXRFdmVudCkgPT4gdm9pZDsga2V5PzogKGU6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW4gfVxuXG4vKiAtLS0tLS0tLS0tIHRoZSBlZGl0aW5nIGVuZ2luZSAtLS0tLS0tLS0tXG4gICBUaGUgdGV4dCBpcyBhIGxpc3Qgb2YgbGluZXMgKHBhcmFncmFwaHMsIGEgaGVhZGluZywgbGlzdCBpdGVtcyBhbmQgcXVvdGUgbGluZXMpIGhvbGRpbmcgYm9sZCwgaXRhbGljLCBpbmxpbmUgY29kZSBhbmQgbGlua3MsXG4gICBhbmQgZXZlcnkgY2hhbmdlIGdvZXMgdGhyb3VnaCBpdDogRW50ZXIsIEJhY2tzcGFjZSBhdCBhIGxpbmUncyBzdGFydCwgZm9ybWF0cywgcGFzdGUgYW5kIGRyb3AsIHNvIHBhc3RlZCBvciBicm93c2VyLW1hZGVcbiAgIG1hcmt1cCBpcyBjbGVhbmVkIGludG8gdGhvc2UgZmV3IHRhZ3MuIFVuZG8gYW5kIHJlZG8gc3RlcCB0aHJvdWdoIGl0cyBvd24gaGlzdG9yeS4gQSBzZWxlY3Rpb24gaXMga2VwdCBhcyB0d28gbnVtYmVycywgdGhlXG4gICBjaGFyYWN0ZXJzIGJlZm9yZSBlYWNoIGVuZCB3aXRoIGEgbGluZSBicmVhayBjb3VudGluZyBvbmUsIHNvIGl0IHN1cnZpdmVzIGV2ZXJ5IHJlYnVpbGQsIGFuZCB0aGUgZWRpdG9yIHdvcmtzIHRoZSBzYW1lIHdpdGhcbiAgIG9yIHdpdGhvdXQgdGhlIGZvY3VzIChhIHN0b3J5IHR5cGVzIGludG8gaXQgd2l0aG91dCB0YWtpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHBhZ2UpLiBQb3J0ZWQgdmVyYmF0aW0gZnJvbSB0aGUgUmVhY3QgZW5naW5lLiAqL1xuY2xhc3MgUnRlRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlZDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9vazogSG9va3M7XG4gIHByaXZhdGUgb2ZmczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBjYXJldDogUmFuZ2UyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZDogeyBhdDogbnVtYmVyOyBtOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmV2OiB7IG86IFJhbmdlMjsga2luZDogJ3N3YXAnIHwgJ2FkZCc7IG9sZHM6IEhUTUxFbGVtZW50W107IG53OiBIVE1MRWxlbWVudCB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgSCA9IHsgbGlzdDogW10gYXMgeyBodG1sOiBzdHJpbmc7IHNlbDogUmFuZ2UyOyBwcmU6IFJhbmdlMiB8IG51bGwgfVtdLCBhdDogMCwgZGlydHk6IGZhbHNlLCBwcmU6IG51bGwgYXMgUmFuZ2UyIHwgbnVsbCwgdDogMCBhcyBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IDAgfTtcblxuICBjb25zdHJ1Y3RvcihlZDogSFRNTEVsZW1lbnQsIGhvb2s6IEhvb2tzKSB7XG4gICAgdGhpcy5lZCA9IGVkOyB0aGlzLmhvb2sgPSBob29rO1xuICAgIGNvbnN0IG9uID0gPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPihlbDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCwgZXY6IEsgfCBzdHJpbmcsIGZuOiAoZTogSFRNTEVsZW1lbnRFdmVudE1hcFtLXSkgPT4gdm9pZCkgPT4geyBlbC5hZGRFdmVudExpc3RlbmVyKGV2LCBmbiBhcyBFdmVudExpc3RlbmVyKTsgdGhpcy5vZmZzLnB1c2goKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgZm4gYXMgRXZlbnRMaXN0ZW5lcikpOyB9O1xuXG4gICAgb24oZWQsICdiZWZvcmVpbnB1dCcsIChlOiBJbnB1dEV2ZW50KSA9PiB0aGlzLm9uQmVmb3JlSW5wdXQoZSkpO1xuICAgIG9uKGVkLCAnaW5wdXQnLCAoKGU6IElucHV0RXZlbnQpID0+IHsgaWYgKHRoaXMucmV2KSByZXR1cm47IGlmICh0aGlzLm1lc3N5KCkpIHRoaXMuY2xlYW4oKTsgdGhpcy50eXBlZCh0aGlzLkgucHJlKTsgdGhpcy5ob29rLmlucHV0Py4oZSk7IH0pIGFzIChlOiBFdmVudCkgPT4gdm9pZCk7XG4gICAgb24oZWQsICdwYXN0ZScsIChlOiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBpZiAodGhpcy5yZXYgfHwgIWUuY2xpcGJvYXJkRGF0YSkgcmV0dXJuO1xuICAgICAgY29uc3QgaCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSwgcyA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG4gICAgICBsZXQgaXRlbXMgPSBoID8gdGhpcy5wYXJzZShuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGgsICd0ZXh0L2h0bWwnKS5ib2R5LCBmYWxzZSkgOiBbXTtcbiAgICAgIGlmICghaXRlbXMubGVuZ3RoKSBpdGVtcyA9IHRoaXMucGxhaW4ocyk7IGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoKCk7IGNvbnN0IG8gPSB0aGlzLmdldCgpLCBhdCA9IHRoaXMuaW5zZXJ0TGluZXMoaXRlbXMsIG8pOyB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy5jb21taXQobyk7XG4gICAgfSk7XG4gICAgb24oZWQsICdjdXQnLCAoZTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgaWYgKHRoaXMucmV2IHx8ICFlLmNsaXBib2FyZERhdGEpIHJldHVybjsgY29uc3QgbyA9IHRoaXMuZ2V0KCk7IGlmIChvLnMgPT09IG8uZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZyA9IHRoaXMubGl2ZSgpOyBlLmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHRoaXMudGV4dChvKSk7IGlmIChnKSB7IGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZC5hcHBlbmRDaGlsZChnLmNsb25lQ29udGVudHMoKSk7IGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L2h0bWwnLCBkLmlubmVySFRNTCk7IH1cbiAgICAgIHRoaXMuZmx1c2goKTsgY29uc3QgcCA9IHRoaXMuZGVsKG8pOyB0aGlzLnNldChwKTsgdGhpcy5jb21taXQobyk7XG4gICAgfSk7XG4gICAgb24oZWQsICdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgIG9uKGVkLCAnZHJvcCcsIChlOiBEcmFnRXZlbnQpID0+IHRoaXMub25Ecm9wKGUpKTtcbiAgICBvbihlZCwgJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbktleURvd24oZSkpO1xuICAgIG9uKGRvY3VtZW50LCAnc2VsZWN0aW9uY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmxpdmUoKSB8fCB0aGlzLnJldikgcmV0dXJuO1xuICAgICAgdGhpcy5jYXJldCA9IHRoaXMuZ2V0KCk7IGlmICh0aGlzLnBlbmQgJiYgKHRoaXMuY2FyZXQucyAhPT0gdGhpcy5wZW5kLmF0IHx8IHRoaXMuY2FyZXQuZSAhPT0gdGhpcy5wZW5kLmF0KSkgdGhpcy5wZW5kID0gbnVsbDtcbiAgICAgIHRoaXMuaG9vay5zZWxlY3Q/LigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50aWR5KCk7IHRoaXMuSC5saXN0ID0gW3sgaHRtbDogZWQuaW5uZXJIVE1MLCBzZWw6IHsgczogMCwgZTogMCB9LCBwcmU6IG51bGwgfV07XG4gIH1cblxuICAvLyAtLS0tIGxpbmVzIGFuZCBvZmZzZXRzIC0tLS1cbiAgcHJpdmF0ZSBsaW5lcygpIHsgcmV0dXJuIFsuLi50aGlzLmVkLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KExFQUYpXTsgfVxuICB0eXBlT2YoYjogRWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBiLnRhZ05hbWUgPT09ICdMSScgPyAoYi5wYXJlbnROb2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IGIudGFnTmFtZSA9PT0gJ0JMT0NLUVVPVEUnID8gJ3F1b3RlJyA6IGIudGFnTmFtZS50b0xvd2VyQ2FzZSgpOyB9XG4gIHByaXZhdGUgbGluZU9mKG46IE5vZGUgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsIHsgZm9yIChsZXQgeCA9IG47IHggJiYgeCAhPT0gdGhpcy5lZDsgeCA9IHgucGFyZW50Tm9kZSkgaWYgKHgubm9kZVR5cGUgPT09IDEgJiYgKHggYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKSkgcmV0dXJuIHggYXMgSFRNTEVsZW1lbnQ7IHJldHVybiBudWxsOyB9XG4gIHByaXZhdGUgbGVuKGI6IE5vZGUpIHsgcmV0dXJuIChiLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGg7IH1cbiAgdG90YWwoKSB7IHJldHVybiB0aGlzLmxpbmVzKCkucmVkdWNlKChuLCBiLCBpKSA9PiBuICsgdGhpcy5sZW4oYikgKyAoaSA/IDEgOiAwKSwgMCk7IH1cbiAgcHJpdmF0ZSBzdGFydE9mKGk6IG51bWJlcikgeyByZXR1cm4gdGhpcy5saW5lcygpLnNsaWNlKDAsIGkpLnJlZHVjZSgobiwgYikgPT4gbiArIHRoaXMubGVuKGIpICsgMSwgMCk7IH1cbiAgcHJpdmF0ZSBsaW5lQXQoYXQ6IG51bWJlcikgeyBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCk7IGxldCBuID0gMDsgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsgaWYgKGF0IDw9IG4gKyB0aGlzLmxlbihhbGxbaV0pKSByZXR1cm4gaTsgbiArPSB0aGlzLmxlbihhbGxbaV0pICsgMTsgfSByZXR1cm4gYWxsLmxlbmd0aCAtIDE7IH1cbiAgdGV4dChvOiBSYW5nZTIpIHsgcmV0dXJuIHRoaXMubGluZXMoKS5tYXAoYiA9PiBiLnRleHRDb250ZW50KS5qb2luKCdcXG4nKS5zbGljZShvLnMsIG8uZSk7IH1cbiAgcHJpdmF0ZSB1cChuOiBOb2RlIHwgbnVsbCwgdGFnOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7IGZvciAobGV0IHggPSBuICYmIG4ubm9kZVR5cGUgPT09IDMgPyBuLnBhcmVudE5vZGUgOiBuOyB4ICYmIHggIT09IHRoaXMuZWQgJiYgeC5ub2RlVHlwZSA9PT0gMSAmJiAhKHggYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKTsgeCA9IHgucGFyZW50Tm9kZSkgaWYgKCh4IGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09IHRhZykgcmV0dXJuIHggYXMgRWxlbWVudDsgcmV0dXJuIG51bGw7IH1cbiAgcHJpdmF0ZSB3cmFwKG46IE5vZGUsIHRhZzogc3RyaW5nLCBocmVmPzogc3RyaW5nIHwgbnVsbCkgeyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcudG9Mb3dlckNhc2UoKSk7IGlmIChocmVmKSB3LnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpOyAobiBhcyBDaGlsZE5vZGUpLnJlcGxhY2VXaXRoKHcpOyB3LmFwcGVuZENoaWxkKG4pOyByZXR1cm4gdzsgfVxuICBwcml2YXRlIHVud3JhcChlbDogRWxlbWVudCkgeyBlbC5yZXBsYWNlV2l0aCguLi5lbC5jaGlsZE5vZGVzKTsgfVxuXG4gIHByaXZhdGUgb2Zmc2V0T2Yobm9kZTogTm9kZSwgb2ZmOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBiID0gdGhpcy5saW5lT2Yobm9kZSk7XG4gICAgaWYgKCFiKSB7XG4gICAgICBpZiAoIXRoaXMuZWQuY29udGFpbnMobm9kZSkpIHJldHVybiAwO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2ZmXSwgZmlyc3QgPSBhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PT0gMSA/ICgoYWZ0ZXIgYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKSA/IGFmdGVyIGFzIEhUTUxFbGVtZW50IDogKGFmdGVyIGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KExFQUYpKSA6IG51bGw7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gdGhpcy50b3RhbCgpO1xuICAgICAgYiA9IGZpcnN0OyBub2RlID0gZmlyc3Q7IG9mZiA9IDA7XG4gICAgfVxuICAgIGxldCBuID0gMDsgZm9yIChjb25zdCB4IG9mIHRoaXMubGluZXMoKSkgeyBpZiAoeCA9PT0gYikgYnJlYWs7IG4gKz0gdGhpcy5sZW4oeCkgKyAxOyB9XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChiLCAwKTsgcmcuc2V0RW5kKG5vZGUsIG9mZik7XG4gICAgcmV0dXJuIG4gKyByZy50b1N0cmluZygpLmxlbmd0aDtcbiAgfVxuICBwcml2YXRlIHBvaW50QXQoYXQ6IG51bWJlciwgbGF0ZSA9IGZhbHNlKTogW05vZGUsIG51bWJlcl0ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubGluZXMoKTsgbGV0IG4gPSBNYXRoLm1heCgwLCBhdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGIgPSBhbGxbaV07XG4gICAgICBpZiAobiA8PSB0aGlzLmxlbihiKSB8fCBpID09PSBhbGwubGVuZ3RoIC0gMSkge1xuICAgICAgICBuID0gTWF0aC5taW4obiwgdGhpcy5sZW4oYikpO1xuICAgICAgICBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihiLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7IGxldCB0OiBUZXh0IHwgbnVsbCwgbGFzdDogVGV4dCB8IG51bGwgPSBudWxsO1xuICAgICAgICB3aGlsZSAoKHQgPSB3Lm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB7IGlmIChsYXRlID8gbiA8IHQuZGF0YS5sZW5ndGggOiBuIDw9IHQuZGF0YS5sZW5ndGgpIHJldHVybiBbdCwgbl07IG4gLT0gdC5kYXRhLmxlbmd0aDsgbGFzdCA9IHQ7IH1cbiAgICAgICAgcmV0dXJuIGxhc3QgPyBbbGFzdCwgbGFzdC5kYXRhLmxlbmd0aF0gOiBbYiwgMF07XG4gICAgICB9XG4gICAgICBuIC09IHRoaXMubGVuKGIpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLmVkLCAwXTtcbiAgfVxuICByYW5nZShvOiBSYW5nZTIpIHsgY29uc3QgW2EsIGFvXSA9IHRoaXMucG9pbnRBdChvLnMsIG8ucyAhPT0gby5lKSwgW2IsIGJvXSA9IHRoaXMucG9pbnRBdChvLmUpOyBjb25zdCByZyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHJnLnNldFN0YXJ0KGEsIGFvKTsgcmcuc2V0RW5kKGIsIGJvKTsgcmV0dXJuIHJnOyB9XG4gIHByaXZhdGUgc2hvd1JhbmdlKHg6IEVsZW1lbnQgfCBSYW5nZSkge1xuICAgIGNvbnN0IHIgPSB4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiID0gdGhpcy5lZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgaWYgKCFyLmhlaWdodCkgcmV0dXJuO1xuICAgIGlmIChyLmJvdHRvbSA+IGIuYm90dG9tIC0gMTIpIHRoaXMuZWQuc2Nyb2xsVG9wICs9IE1hdGgubWluKHIuYm90dG9tIC0gYi5ib3R0b20gKyAxMiwgci50b3AgLSBiLnRvcCAtIDEyKTtcbiAgICBlbHNlIGlmIChyLnRvcCA8IGIudG9wICsgMTIpIHRoaXMuZWQuc2Nyb2xsVG9wIC09IGIudG9wICsgMTIgLSByLnRvcDtcbiAgfVxuXG4gIC8vIC0tLS0gc2VsZWN0aW9uIC0tLS1cbiAgcHJpdmF0ZSBsaXZlKCkgeyBjb25zdCBzID0gZ2V0U2VsZWN0aW9uKCk7IGlmICghcyB8fCAhcy5yYW5nZUNvdW50KSByZXR1cm4gbnVsbDsgY29uc3QgZyA9IHMuZ2V0UmFuZ2VBdCgwKTsgcmV0dXJuIHRoaXMuZWQuY29udGFpbnMoZy5zdGFydENvbnRhaW5lcikgJiYgdGhpcy5lZC5jb250YWlucyhnLmVuZENvbnRhaW5lcikgPyBnIDogbnVsbDsgfVxuICBnZXQoKTogUmFuZ2UyIHtcbiAgICBjb25zdCBnID0gdGhpcy5saXZlKCk7XG4gICAgaWYgKGcpIHsgY29uc3QgYSA9IHRoaXMub2Zmc2V0T2YoZy5zdGFydENvbnRhaW5lciwgZy5zdGFydE9mZnNldCksIGIgPSB0aGlzLm9mZnNldE9mKGcuZW5kQ29udGFpbmVyLCBnLmVuZE9mZnNldCk7IHJldHVybiB7IHM6IE1hdGgubWluKGEsIGIpLCBlOiBNYXRoLm1heChhLCBiKSB9OyB9XG4gICAgaWYgKCF0aGlzLmNhcmV0KSB7IGNvbnN0IHQgPSB0aGlzLnRvdGFsKCk7IHRoaXMuY2FyZXQgPSB7IHM6IHQsIGU6IHQgfTsgfVxuICAgIHJldHVybiB7IHM6IHRoaXMuY2FyZXQucywgZTogdGhpcy5jYXJldC5lIH07XG4gIH1cbiAgc2V0KG86IFJhbmdlMiwgZm9jdXMgPSBmYWxzZSkge1xuICAgIHRoaXMuY2FyZXQgPSB7IHM6IG8ucywgZTogby5lIH07XG4gICAgaWYgKGZvY3VzICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuZWQpIHRoaXMuZWQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLmVkKSByZXR1cm47XG4gICAgY29uc3QgcyA9IGdldFNlbGVjdGlvbigpOyBpZiAoIXMpIHJldHVybjsgcy5yZW1vdmVBbGxSYW5nZXMoKTsgcy5hZGRSYW5nZSh0aGlzLnJhbmdlKG8pKTtcbiAgfVxuXG4gIC8vIC0tLS0gdGlkeWluZyAtLS0tXG4gIHByaXZhdGUgdGlkeSgpIHtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIHRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYixpLGNvZGUsYScpKSB7XG4gICAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSBjb250aW51ZTtcbiAgICAgIGlmICghZWwudGV4dENvbnRlbnQpIHsgZWwucmVtb3ZlKCk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodGhpcy51cChlbC5wYXJlbnROb2RlLCBlbC50YWdOYW1lKSkgdGhpcy51bndyYXAoZWwpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIHRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYixpLGNvZGUsYScpKSB7XG4gICAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSBjb250aW51ZTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG54ID0gZWwubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlIChueCAmJiBueC5ub2RlVHlwZSA9PT0gMyAmJiAhKG54IGFzIFRleHQpLmRhdGEpIHsgY29uc3QgZCA9IG54OyBueCA9IG54Lm5leHRTaWJsaW5nOyBkLnJlbW92ZSgpOyB9XG4gICAgICAgIGlmICghbnggfHwgbngubm9kZVR5cGUgIT09IDEgfHwgKG54IGFzIEVsZW1lbnQpLnRhZ05hbWUgIT09IGVsLnRhZ05hbWUgfHwgKG54IGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnaHJlZicpICE9PSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkgYnJlYWs7XG4gICAgICAgIGVsLmFwcGVuZCguLi5ueC5jaGlsZE5vZGVzKTsgbngucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmxpbmVzKCkpIHsgY29uc3QgYnIgPSBbLi4uYi5xdWVyeVNlbGVjdG9yQWxsKCdicicpXTsgaWYgKGIudGV4dENvbnRlbnQpIGJyLmZvckVhY2goeCA9PiB4LnJlbW92ZSgpKTsgZWxzZSBpZiAoIWJyLmxlbmd0aCkgYi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsgZWxzZSBici5zbGljZSgxKS5mb3JFYWNoKHggPT4geC5yZW1vdmUoKSk7IH1cbiAgICBpZiAoIXRoaXMubGluZXMoKS5sZW5ndGgpIHsgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsgdGhpcy5lZC5yZXBsYWNlQ2hpbGRyZW4ocCk7IH1cbiAgICB0aGlzLmVkLm5vcm1hbGl6ZSgpO1xuICB9XG4gIHByaXZhdGUgcmVidWlsZChzcGVjOiBbc3RyaW5nLCBOb2RlXVtdKSB7XG4gICAgY29uc3QgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsgbGV0IGxpc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBbdCwgYl0gb2Ygc3BlYykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQgPT09ICdxdW90ZScgPyAnYmxvY2txdW90ZScgOiB0ID09PSAndWwnIHx8IHQgPT09ICdvbCcgPyAnbGknIDogdCk7XG4gICAgICBlbC5hcHBlbmQoLi4uYi5jaGlsZE5vZGVzKTtcbiAgICAgIGlmICh0ID09PSAndWwnIHx8IHQgPT09ICdvbCcpIHsgaWYgKCFsaXN0IHx8IGxpc3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0KSBmcmFnLmFwcGVuZENoaWxkKGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpKTsgbGlzdC5hcHBlbmRDaGlsZChlbCk7IH1cbiAgICAgIGVsc2UgeyBsaXN0ID0gbnVsbDsgZnJhZy5hcHBlbmRDaGlsZChlbCk7IH1cbiAgICB9XG4gICAgdGhpcy5lZC5yZXBsYWNlQ2hpbGRyZW4oZnJhZyk7IHRoaXMudGlkeSgpO1xuICB9XG4gIHByaXZhdGUgc3BlY09mKCk6IFtzdHJpbmcsIE5vZGVdW10geyByZXR1cm4gdGhpcy5saW5lcygpLm1hcChiID0+IFt0aGlzLnR5cGVPZihiKSwgYl0pOyB9XG4gIHByaXZhdGUgbWVzc3koKSB7XG4gICAgZm9yIChjb25zdCBuIG9mIHRoaXMuZWQuY2hpbGROb2Rlcykge1xuICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDMgPyAobiBhcyBUZXh0KS5kYXRhLnRyaW0oKSA6IG4ubm9kZVR5cGUgPT09IDEgJiYgIS9eKFB8SDJ8QkxPQ0tRVU9URXxVTHxPTCkkLy50ZXN0KChuIGFzIEVsZW1lbnQpLnRhZ05hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxICYmIC9eKFVMfE9MKSQvLnRlc3QoKG4gYXMgRWxlbWVudCkudGFnTmFtZSkgJiYgWy4uLm4uY2hpbGROb2Rlc10uc29tZSh4ID0+IHgubm9kZVR5cGUgIT09IDEgfHwgKHggYXMgRWxlbWVudCkudGFnTmFtZSAhPT0gJ0xJJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLmVkLnF1ZXJ5U2VsZWN0b3IoJ1tzdHlsZV0sW2NsYXNzXSxzcGFuLGZvbnQsZGl2LGE6bm90KFtocmVmXSksOmlzKHAsaDIsYmxvY2txdW90ZSxsaSkgOm5vdChiLGksY29kZSxhLGJyKScpO1xuICB9XG5cbiAgLy8gLS0tLSBwYXJzZSAtLS0tXG4gIHByaXZhdGUgcGFyc2Uocm9vdDogTm9kZSwga2VlcDogYm9vbGVhbik6IExpbmVbXSB7XG4gICAgY29uc3Qgb3V0OiB7IHQ6IHN0cmluZzsgZnJhZzogRG9jdW1lbnRGcmFnbWVudCB9W10gPSBbXTsgbGV0IGN1cjogeyB0OiBzdHJpbmc7IGZyYWc6IERvY3VtZW50RnJhZ21lbnQgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHdhbGsgPSAobm9kZTogTm9kZSwgdDogc3RyaW5nLCBwcmU6IGJvb2xlYW4sIG1hcmtzOiBbc3RyaW5nLCBzdHJpbmc/XVtdKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgY29uc3QgZCA9IChuIGFzIFRleHQpLmRhdGE7XG4gICAgICAgICAgbGV0IHMgPSBrZWVwID8gZCA6IHByZSA/IGQucmVwbGFjZSgvXFxyXFxuPy9nLCAnXFxuJykgOiBkLnJlcGxhY2UoL1tcXHMgXSsvZywgJyAnKTtcbiAgICAgICAgICBpZiAoIWtlZXApIHMgPSBzLnJlcGxhY2UoLyAvZywgJyAnKTtcbiAgICAgICAgICBpZiAoIWN1ciAmJiAhcy50cmltKCkgJiYgKG5vZGUgPT09IHJvb3QgfHwgL14oVUx8T0x8REx8VEFCTEV8VEJPRFl8VEhFQUR8VEZPT1R8VFIpJC8udGVzdCgobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lKSkpIGNvbnRpbnVlO1xuICAgICAgICAgIChwcmUgJiYgIWtlZXAgPyBzLnNwbGl0KCdcXG4nKSA6IFtzXSkuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkpIGN1ciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIXAgfHwgKCFjdXIgJiYgIWtlZXAgJiYgIXAudHJpbSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjdXIpIG91dC5wdXNoKGN1ciA9IHsgdCwgZnJhZzogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIH0pO1xuICAgICAgICAgICAgbGV0IHg6IE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwKTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSBtYXJrcy5sZW5ndGggLSAxOyBtID49IDA7IG0tLSkgeyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChtYXJrc1ttXVswXS50b0xvd2VyQ2FzZSgpKTsgaWYgKG1hcmtzW21dWzFdKSB3LnNldEF0dHJpYnV0ZSgnaHJlZicsIG1hcmtzW21dWzFdISk7IHcuYXBwZW5kQ2hpbGQoeCk7IHggPSB3OyB9XG4gICAgICAgICAgICBjdXIuZnJhZy5hcHBlbmRDaGlsZCh4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobi5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGVsID0gbiBhcyBFbGVtZW50LCB0ZyA9IGVsLnRhZ05hbWU7XG4gICAgICAgIGlmIChTS0lQLnRlc3QodGcpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygndm8tcnRlLW5ldycpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3NzID0gKGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRnID09PSAnQlInKSB7IGN1ciA9IG51bGw7IGNvbnRpbnVlOyB9XG4gICAgICAgIGlmIChCTE9DSy50ZXN0KHRnKSkge1xuICAgICAgICAgIGNvbnN0IG50ID0gL15IWzEtNl0kLy50ZXN0KHRnKSA/ICdoMicgOiB0ZyA9PT0gJ0xJJyA/IChlbC5wYXJlbnRFbGVtZW50ICYmIGVsLnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ09MJyA/ICdvbCcgOiAndWwnKSA6IHRnID09PSAnQkxPQ0tRVU9URScgPyAncXVvdGUnIDogdDtcbiAgICAgICAgICBjdXIgPSBudWxsOyBjb25zdCB3YXMgPSBvdXQubGVuZ3RoO1xuICAgICAgICAgIHdhbGsoZWwsIG50LCBwcmUgfHwgdGcgPT09ICdQUkUnLCBtYXJrcyk7XG4gICAgICAgICAgaWYgKGtlZXAgJiYgb3V0Lmxlbmd0aCA9PT0gd2FzICYmICFlbC5xdWVyeVNlbGVjdG9yKCdwLGRpdixoMSxoMixoMyxoNCxoNSxoNixsaSxibG9ja3F1b3RlLHByZSx1bCxvbCcpKSBvdXQucHVzaCh7IHQ6IG50LCBmcmFnOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgfSk7XG4gICAgICAgICAgY3VyID0gbnVsbDsgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG0gPSBtYXJrczsgY29uc3QgYWRkID0gKHRhZzogc3RyaW5nLCBocmVmPzogc3RyaW5nKSA9PiB7IGlmICghbS5zb21lKHggPT4geFswXSA9PT0gdGFnKSkgbSA9IFsuLi5tLCBbdGFnLCBocmVmXV07IH07XG4gICAgICAgIGlmICh0ZyA9PT0gJ0InIHx8IHRnID09PSAnU1RST05HJyA/ICEvZm9udC13ZWlnaHRcXHMqOlxccyoobm9ybWFsfFsxLTRdMDApLy50ZXN0KGNzcykgOiAvZm9udC13ZWlnaHRcXHMqOlxccyooYm9sZHxbNi05XTAwKS8udGVzdChjc3MpKSBhZGQoJ0InKTtcbiAgICAgICAgaWYgKHRnID09PSAnSScgfHwgdGcgPT09ICdFTScgfHwgL2ZvbnQtc3R5bGVcXHMqOlxccyppdGFsaWMvLnRlc3QoY3NzKSkgYWRkKCdJJyk7XG4gICAgICAgIGlmICgvXihDT0RFfEtCRHxTQU1QfFRUKSQvLnRlc3QodGcpKSBhZGQoJ0NPREUnKTtcbiAgICAgICAgaWYgKHRnID09PSAnQScpIHsgY29uc3QgaCA9IHNhZmVVcmwoZWwuZ2V0QXR0cmlidXRlKCdocmVmJykpOyBpZiAoaCkgYWRkKCdBJywgaCk7IH1cbiAgICAgICAgd2FsayhlbCwgdCwgcHJlLCBtKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsocm9vdCwgJ3AnLCBmYWxzZSwgW10pO1xuICAgIGlmICgha2VlcCkgZm9yIChjb25zdCB4IG9mIG91dCkge1xuICAgICAgY29uc3QgdHM6IFRleHRbXSA9IFtdLCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih4LmZyYWcsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTsgbGV0IHQ6IFRleHQgfCBudWxsOyB3aGlsZSAoKHQgPSB3Lm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB0cy5wdXNoKHQpO1xuICAgICAgaWYgKHRzLmxlbmd0aCkgeyB0c1swXS5kYXRhID0gdHNbMF0uZGF0YS5yZXBsYWNlKC9eXFxzKy8sICcnKTsgdHNbdHMubGVuZ3RoIC0gMV0uZGF0YSA9IHRzW3RzLmxlbmd0aCAtIDFdLmRhdGEucmVwbGFjZSgvXFxzKyQvLCAnJyk7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dC5maWx0ZXIoeCA9PiBrZWVwIHx8IHguZnJhZy50ZXh0Q29udGVudCkubWFwKHggPT4gKHsgLi4ueCwgbGVuOiAoeC5mcmFnLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGggfSkpO1xuICB9XG4gIHByaXZhdGUgcGxhaW4oczogc3RyaW5nKTogTGluZVtdIHsgcmV0dXJuIHMucmVwbGFjZSgvXFxyXFxuPy9nLCAnXFxuJykuc3BsaXQoJ1xcbicpLmZpbHRlcihsID0+IGwudHJpbSgpKS5tYXAobCA9PiB7IGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7IGZyYWcuYXBwZW5kKGwpOyByZXR1cm4geyB0OiAncCcsIGZyYWcsIGxlbjogbC5sZW5ndGggfTsgfSk7IH1cbiAgcHJpdmF0ZSBjbGVhbigpIHsgY29uc3QgbyA9IHRoaXMuZ2V0KCk7IHRoaXMucmVidWlsZCh0aGlzLnBhcnNlKHRoaXMuZWQsIHRydWUpLm1hcCh4ID0+IFt4LnQsIHguZnJhZ10pKTsgdGhpcy5zZXQobyk7IH1cblxuICAvLyAtLS0tIGhpc3RvcnkgLS0tLVxuICBwcml2YXRlIGNoYW5nZWQoKSB7IHRoaXMuaG9vay5jaGFuZ2U/LigpOyB9XG4gIHByaXZhdGUgY29tbWl0KHByZT86IFJhbmdlMikge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLkgudCk7IGNvbnN0IGh0bWwgPSB0aGlzLmVkLmlubmVySFRNTCwgdG9wID0gdGhpcy5ILmxpc3RbdGhpcy5ILmF0XSwgYmVmb3JlID0gdGhpcy5ILnByZSB8fCBwcmUgfHwgbnVsbDtcbiAgICB0aGlzLkguZGlydHkgPSBmYWxzZTsgdGhpcy5ILnByZSA9IG51bGw7XG4gICAgaWYgKCF0b3AgfHwgdG9wLmh0bWwgIT09IGh0bWwpIHsgdGhpcy5ILmxpc3Quc3BsaWNlKHRoaXMuSC5hdCArIDEpOyB0aGlzLkgubGlzdC5wdXNoKHsgaHRtbCwgc2VsOiB0aGlzLmdldCgpLCBwcmU6IGJlZm9yZSB9KTsgaWYgKHRoaXMuSC5saXN0Lmxlbmd0aCA+IDMwMCkgdGhpcy5ILmxpc3Quc2hpZnQoKTsgdGhpcy5ILmF0ID0gdGhpcy5ILmxpc3QubGVuZ3RoIC0gMTsgfVxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG4gIGZsdXNoKCkgeyBpZiAodGhpcy5ILmRpcnR5KSB0aGlzLmNvbW1pdCgpOyB9XG4gIHByaXZhdGUgdHlwZWQocHJlPzogUmFuZ2UyIHwgbnVsbCkgeyBpZiAoIXRoaXMuSC5kaXJ0eSkgeyB0aGlzLkgucHJlID0gcHJlIHx8IG51bGw7IHRoaXMuSC5saXN0LnNwbGljZSh0aGlzLkguYXQgKyAxKTsgfSB0aGlzLkguZGlydHkgPSB0cnVlOyBjbGVhclRpbWVvdXQodGhpcy5ILnQpOyB0aGlzLkgudCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb21taXQoKSwgNzAwKTsgdGhpcy5jaGFuZ2VkKCk7IH1cbiAgcHJpdmF0ZSByZXN0b3JlKGh0bWw6IHN0cmluZywgc2VsOiBSYW5nZTIgfCBudWxsKSB7IHRoaXMuZWQuaW5uZXJIVE1MID0gaHRtbDsgdGhpcy5wZW5kID0gbnVsbDsgdGhpcy5zZXQoc2VsIHx8IHsgczogMCwgZTogMCB9KTsgdGhpcy5jaGFuZ2VkKCk7IH1cbiAgdW5kbygpIHsgdGhpcy5mbHVzaCgpOyBpZiAodGhpcy5ILmF0IDw9IDApIHJldHVybjsgY29uc3QgY3VyID0gdGhpcy5ILmxpc3RbdGhpcy5ILmF0XTsgdGhpcy5ILmF0LS07IHRoaXMucmVzdG9yZSh0aGlzLkgubGlzdFt0aGlzLkguYXRdLmh0bWwsIGN1ci5wcmUgfHwgdGhpcy5ILmxpc3RbdGhpcy5ILmF0XS5zZWwpOyB9XG4gIHJlZG8oKSB7IHRoaXMuZmx1c2goKTsgaWYgKHRoaXMuSC5hdCA+PSB0aGlzLkgubGlzdC5sZW5ndGggLSAxKSByZXR1cm47IHRoaXMuSC5hdCsrOyB0aGlzLnJlc3RvcmUodGhpcy5ILmxpc3RbdGhpcy5ILmF0XS5odG1sLCB0aGlzLkgubGlzdFt0aGlzLkguYXRdLnNlbCk7IH1cbiAgbG9hZChodG1sOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsgdC5pbm5lckhUTUwgPSBodG1sIHx8ICcnO1xuICAgIHRoaXMucmVidWlsZCh0aGlzLnBhcnNlKHQuY29udGVudCwgZmFsc2UpLm1hcCh4ID0+IFt4LnQsIHguZnJhZ10pKTsgdGhpcy5jYXJldCA9IG51bGw7IHRoaXMucGVuZCA9IG51bGw7IHRoaXMucmV2ID0gbnVsbDtcbiAgICB0aGlzLkgubGlzdCA9IFt7IGh0bWw6IHRoaXMuZWQuaW5uZXJIVE1MLCBzZWw6IHsgczogMCwgZTogMCB9LCBwcmU6IG51bGwgfV07IHRoaXMuSC5hdCA9IDA7IHRoaXMuSC5kaXJ0eSA9IGZhbHNlOyBjbGVhclRpbWVvdXQodGhpcy5ILnQpOyB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8vIC0tLS0gZWRpdHMgLS0tLVxuICBwcml2YXRlIHRleHRzKCkgeyBjb25zdCBvdXQ6IFtUZXh0LCBudW1iZXJdW10gPSBbXTsgbGV0IG4gPSAwOyB0aGlzLmxpbmVzKCkuZm9yRWFjaCgoYiwgaSkgPT4geyBpZiAoaSkgbisrOyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihiLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7IGxldCB0OiBUZXh0IHwgbnVsbDsgd2hpbGUgKCh0ID0gdy5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkgeyBvdXQucHVzaChbdCwgbl0pOyBuICs9IHQuZGF0YS5sZW5ndGg7IH0gfSk7IHJldHVybiBvdXQ7IH1cbiAgcHJpdmF0ZSBjdXQoYXQ6IG51bWJlcikgeyBmb3IgKGNvbnN0IFt0LCBuXSBvZiB0aGlzLnRleHRzKCkpIGlmIChhdCA+IG4gJiYgYXQgPCBuICsgdC5kYXRhLmxlbmd0aCkgeyB0LnNwbGl0VGV4dChhdCAtIG4pOyByZXR1cm47IH0gfVxuICBwcml2YXRlIGNvdmVyZWQobzogUmFuZ2UyKSB7IHRoaXMuY3V0KG8uZSk7IHRoaXMuY3V0KG8ucyk7IHJldHVybiB0aGlzLnRleHRzKCkuZmlsdGVyKChbdCwgbl0pID0+IHQuZGF0YS5sZW5ndGggJiYgbiA+PSBvLnMgJiYgbiArIHQuZGF0YS5sZW5ndGggPD0gby5lKS5tYXAoeCA9PiB4WzBdKTsgfVxuICBwcml2YXRlIGhhcyh0YWc6IHN0cmluZywgbzogUmFuZ2UyKSB7XG4gICAgaWYgKG8ucyA9PT0gby5lKSB7XG4gICAgICBpZiAodGhpcy5wZW5kICYmIHRoaXMucGVuZC5hdCA9PT0gby5zICYmIHRhZyBpbiB0aGlzLnBlbmQubSkgcmV0dXJuIHRoaXMucGVuZC5tW3RhZ107XG4gICAgICBjb25zdCBnID0gdGhpcy5saXZlKCk7IHJldHVybiAhIXRoaXMudXAoZyAmJiBnLmNvbGxhcHNlZCA/IGcuc3RhcnRDb250YWluZXIgOiB0aGlzLnBvaW50QXQoby5zKVswXSwgdGFnKTtcbiAgICB9XG4gICAgY29uc3QgdHMgPSB0aGlzLnRleHRzKCkuZmlsdGVyKChbdCwgbl0pID0+IHQuZGF0YS5sZW5ndGggJiYgbiA8IG8uZSAmJiBuICsgdC5kYXRhLmxlbmd0aCA+IG8ucyk7XG4gICAgcmV0dXJuIHRzLmxlbmd0aCA+IDAgJiYgdHMuZXZlcnkoKFt0XSkgPT4gdGhpcy51cCh0LCB0YWcpKTtcbiAgfVxuICBpbmxpbmUodGFnOiBzdHJpbmcsIGhyZWY/OiBzdHJpbmcgfCBudWxsLCBvID0gdGhpcy5nZXQoKSkge1xuICAgIGlmIChvLnMgPT09IG8uZSkge1xuICAgICAgaWYgKHRhZyA9PT0gJ0EnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMucGVuZCB8fCB0aGlzLnBlbmQuYXQgIT09IG8ucykgdGhpcy5wZW5kID0geyBhdDogby5zLCBtOiB7fSB9O1xuICAgICAgdGhpcy5wZW5kLm1bdGFnXSA9ICF0aGlzLmhhcyh0YWcsIG8pOyB0aGlzLmNoYW5nZWQoKTsgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoKCk7XG4gICAgY29uc3QgdHMgPSB0aGlzLmNvdmVyZWQobyk7IGlmICghdHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYWRkID0gaHJlZiAhPT0gdW5kZWZpbmVkID8gaHJlZiAhPT0gbnVsbCA6ICF0cy5ldmVyeSh0ID0+IHRoaXMudXAodCwgdGFnKSk7XG4gICAgaWYgKGFkZCkgdHMuZm9yRWFjaCh0ID0+IHsgY29uc3QgaGFkID0gdGhpcy51cCh0LCB0YWcpOyBpZiAoIWhhZCkgdGhpcy53cmFwKHQsIHRhZywgaHJlZik7IGVsc2UgaWYgKGhyZWYpIGhhZC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTsgfSk7XG4gICAgZWxzZSBuZXcgU2V0KHRzLm1hcCh0ID0+IHRoaXMudXAodCwgdGFnKSkpLmZvckVhY2goZWwgPT4ge1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qga2VlcDogVGV4dFtdID0gW10sIHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGVsLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCksIGggPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsgbGV0IHQ6IFRleHQgfCBudWxsO1xuICAgICAgd2hpbGUgKCh0ID0gdy5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkgaWYgKCF0cy5pbmNsdWRlcyh0KSkga2VlcC5wdXNoKHQpO1xuICAgICAgdGhpcy51bndyYXAoZWwpOyBrZWVwLmZvckVhY2goeCA9PiB0aGlzLndyYXAoeCwgdGFnLCBoKSk7XG4gICAgfSk7XG4gICAgdGhpcy50aWR5KCk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChvKTtcbiAgfVxuICBwcml2YXRlIHR5cGVTdHlsZWQoczogc3RyaW5nKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuZ2V0KCksIG0gPSB0aGlzLnBlbmQhLm07IHRoaXMucGVuZCA9IG51bGw7XG4gICAgY29uc3QgZyA9IHRoaXMubGl2ZSgpLCBbbiwga10gPSBnICYmIGcuY29sbGFwc2VkID8gW2cuc3RhcnRDb250YWluZXIsIGcuc3RhcnRPZmZzZXRdIGFzIFtOb2RlLCBudW1iZXJdIDogdGhpcy5wb2ludEF0KG8ucyk7XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChuLCBrKTsgcmcuY29sbGFwc2UodHJ1ZSk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgT2JqZWN0LmtleXMobSkpIGlmICghbVt0YWddKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMudXAocmcuc3RhcnRDb250YWluZXIsIHRhZyk7IGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGFpbCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHRhaWwuc2V0U3RhcnQocmcuc3RhcnRDb250YWluZXIsIHJnLnN0YXJ0T2Zmc2V0KTsgdGFpbC5zZXRFbmRBZnRlcihlbCk7XG4gICAgICBlbC5hZnRlcih0YWlsLmV4dHJhY3RDb250ZW50cygpKTsgcmcuc2V0U3RhcnRBZnRlcihlbCk7IHJnLmNvbGxhcHNlKHRydWUpO1xuICAgIH1cbiAgICBsZXQgeDogTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIE9iamVjdC5rZXlzKG0pKSBpZiAobVt0YWddICYmICF0aGlzLnVwKHJnLnN0YXJ0Q29udGFpbmVyLCB0YWcpKSB7IGNvbnN0IHcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZy50b0xvd2VyQ2FzZSgpKTsgdy5hcHBlbmRDaGlsZCh4KTsgeCA9IHc7IH1cbiAgICByZy5pbnNlcnROb2RlKHgpOyB0aGlzLnRpZHkoKTsgdGhpcy5zZXQoeyBzOiBvLnMgKyBzLmxlbmd0aCwgZTogby5zICsgcy5sZW5ndGggfSk7IHRoaXMudHlwZWQobyk7XG4gIH1cbiAgYmxvY2sodHlwZTogc3RyaW5nLCBvID0gdGhpcy5nZXQoKSkge1xuICAgIHRoaXMuZmx1c2goKTsgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBhID0gdGhpcy5saW5lQXQoby5zKSwgeiA9IHRoaXMubGluZUF0KG8uZSk7XG4gICAgY29uc3QgdG8gPSBhbGwuc2xpY2UoYSwgeiArIDEpLmV2ZXJ5KGIgPT4gdGhpcy50eXBlT2YoYikgPT09IHR5cGUpID8gJ3AnIDogdHlwZTtcbiAgICB0aGlzLnJlYnVpbGQoYWxsLm1hcCgoYiwgaSk6IFtzdHJpbmcsIE5vZGVdID0+IFtpID49IGEgJiYgaSA8PSB6ID8gdG8gOiB0aGlzLnR5cGVPZihiKSwgYl0pKTsgdGhpcy5zZXQobyk7IHRoaXMuY29tbWl0KG8pO1xuICB9XG4gIHByaXZhdGUgZGVsKG86IFJhbmdlMik6IFJhbmdlMiB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBpID0gdGhpcy5saW5lQXQoby5zKSwgaiA9IHRoaXMubGluZUF0KG8uZSksIFthLCBhb10gPSB0aGlzLnBvaW50QXQoby5zLCB0cnVlKSwgW2IsIGJvXSA9IHRoaXMucG9pbnRBdChvLmUpO1xuICAgIGlmIChpID09PSBqKSB7IGNvbnN0IHJnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsgcmcuc2V0U3RhcnQoYSwgYW8pOyByZy5zZXRFbmQoYiwgYm8pOyByZy5kZWxldGVDb250ZW50cygpOyB0aGlzLnRpZHkoKTsgcmV0dXJuIHsgczogby5zLCBlOiBvLnMgfTsgfVxuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyBoZWFkLnNldFN0YXJ0KGEsIGFvKTsgaGVhZC5zZXRFbmQoYWxsW2ldLCBhbGxbaV0uY2hpbGROb2Rlcy5sZW5ndGgpOyBoZWFkLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgY29uc3QgdGFpbCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHRhaWwuc2V0U3RhcnQoYWxsW2pdLCAwKTsgdGFpbC5zZXRFbmQoYiwgYm8pOyB0YWlsLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgYWxsW2ldLmFwcGVuZCguLi5hbGxbal0uY2hpbGROb2Rlcyk7XG4gICAgdGhpcy5yZWJ1aWxkKGFsbC5maWx0ZXIoKF8sIGspID0+IGsgPD0gaSB8fCBrID4gaikubWFwKCh4KTogW3N0cmluZywgTm9kZV0gPT4gW3RoaXMudHlwZU9mKHgpLCB4XSkpO1xuICAgIHJldHVybiB7IHM6IG8ucywgZTogby5zIH07XG4gIH1cbiAgc3BsaXQobyA9IHRoaXMuZ2V0KCkpIHtcbiAgICB0aGlzLmZsdXNoKCk7IGNvbnN0IHByZSA9IG87IGlmIChvLnMgIT09IG8uZSkgbyA9IHRoaXMuZGVsKG8pO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubGluZXMoKSwgaSA9IHRoaXMubGluZUF0KG8ucyksIGIgPSBhbGxbaV0sIHQgPSB0aGlzLnR5cGVPZihiKSwgc3BlYyA9IHRoaXMuc3BlY09mKCksIG5leHQgPSB0ID09PSAnaDInID8gJ3AnIDogdDtcbiAgICBpZiAoIXRoaXMubGVuKGIpICYmIHQgIT09ICdwJykgeyBzcGVjW2ldWzBdID0gJ3AnOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChwcmUpOyByZXR1cm47IH1cbiAgICBpZiAodGhpcy5sZW4oYikgJiYgby5zID09PSB0aGlzLnN0YXJ0T2YoaSkpIHsgc3BlYy5zcGxpY2UoaSwgMCwgW25leHQsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKV0pOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KHsgczogby5zICsgMSwgZTogby5zICsgMSB9KTsgdGhpcy5jb21taXQocHJlKTsgcmV0dXJuOyB9XG4gICAgY29uc3QgW24sIGtdID0gdGhpcy5wb2ludEF0KG8ucyksIHJnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsgcmcuc2V0U3RhcnQobiwgayk7IHJnLnNldEVuZChiLCBiLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICBjb25zdCBuYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsgbmIuYXBwZW5kQ2hpbGQocmcuZXh0cmFjdENvbnRlbnRzKCkpO1xuICAgIHNwZWMuc3BsaWNlKGkgKyAxLCAwLCBbbmV4dCwgbmJdKTsgdGhpcy5yZWJ1aWxkKHNwZWMpOyB0aGlzLnNldCh7IHM6IG8ucyArIDEsIGU6IG8ucyArIDEgfSk7IHRoaXMuY29tbWl0KHByZSk7XG4gIH1cbiAgcHJpdmF0ZSBqb2luQmFjayhvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBzcGVjID0gdGhpcy5zcGVjT2YoKTtcbiAgICBpZiAoc3BlY1tpXVswXSAhPT0gJ3AnKSB7IHNwZWNbaV1bMF0gPSAncCc7IHRoaXMucmVidWlsZChzcGVjKTsgdGhpcy5zZXQobyk7IHRoaXMuY29tbWl0KG8pOyByZXR1cm47IH1cbiAgICBpZiAoIWkpIHJldHVybjtcbiAgICBhbGxbaSAtIDFdLmFwcGVuZCguLi5hbGxbaV0uY2hpbGROb2Rlcyk7IHNwZWMuc3BsaWNlKGksIDEpOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KHsgczogby5zIC0gMSwgZTogby5zIC0gMSB9KTsgdGhpcy5jb21taXQobyk7XG4gIH1cbiAgcHJpdmF0ZSBqb2luTmV4dChvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBzcGVjID0gdGhpcy5zcGVjT2YoKTsgaWYgKGkgPj0gYWxsLmxlbmd0aCAtIDEpIHJldHVybjtcbiAgICBhbGxbaV0uYXBwZW5kKC4uLmFsbFtpICsgMV0uY2hpbGROb2Rlcyk7IHNwZWMuc3BsaWNlKGkgKyAxLCAxKTsgdGhpcy5yZWJ1aWxkKHNwZWMpOyB0aGlzLnNldChvKTsgdGhpcy5jb21taXQobyk7XG4gIH1cbiAgcHJpdmF0ZSBpbnNlcnQoczogc3RyaW5nLCBvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBbbiwga10gPSB0aGlzLnBvaW50QXQoby5zKTtcbiAgICBpZiAobi5ub2RlVHlwZSA9PT0gMykgKG4gYXMgVGV4dCkuaW5zZXJ0RGF0YShrLCBzKTsgZWxzZSBuLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSwgbi5jaGlsZE5vZGVzW2tdIHx8IG51bGwpO1xuICAgIHRoaXMudGlkeSgpOyByZXR1cm4gby5zICsgcy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSBpbnNlcnRMaW5lcyhpdGVtczogTGluZVtdLCBvOiBSYW5nZTIpIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIG8ucztcbiAgICBpZiAoby5zICE9PSBvLmUpIG8gPSB0aGlzLmRlbChvKTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBiID0gYWxsW2ldLCBbbiwga10gPSB0aGlzLnBvaW50QXQoby5zKSwgc3BlYyA9IHRoaXMuc3BlY09mKCk7XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChuLCBrKTsgcmcuc2V0RW5kKGIsIGIuY2hpbGROb2Rlcy5sZW5ndGgpOyBjb25zdCB0YWlsID0gcmcuZXh0cmFjdENvbnRlbnRzKCk7XG4gICAgaWYgKCFiLnRleHRDb250ZW50ICYmIGl0ZW1zWzBdLnQgIT09ICdwJykgc3BlY1tpXVswXSA9IGl0ZW1zWzBdLnQ7XG4gICAgbGV0IGF0ID0gby5zICsgaXRlbXNbMF0ubGVuOyBiLmFwcGVuZChpdGVtc1swXS5mcmFnKTtcbiAgICBjb25zdCByZXN0ID0gaXRlbXMuc2xpY2UoMSkubWFwKCh4KTogW3N0cmluZywgTm9kZV0gPT4geyBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOyBwLmFwcGVuZCh4LmZyYWcpOyBhdCArPSAxICsgeC5sZW47IHJldHVybiBbeC50LCBwXTsgfSk7XG4gICAgc3BlYy5zcGxpY2UoaSArIDEsIDAsIC4uLnJlc3QpOyAocmVzdC5sZW5ndGggPyByZXN0W3Jlc3QubGVuZ3RoIC0gMV1bMV0gYXMgSFRNTEVsZW1lbnQgOiBiKS5hcHBlbmQodGFpbCk7XG4gICAgdGhpcy5yZWJ1aWxkKHNwZWMpOyByZXR1cm4gYXQ7XG4gIH1cbiAgbGluayhvOiBSYW5nZTIsIGhyZWY6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLmZsdXNoKCk7XG4gICAgaWYgKCFocmVmKSB7IGNvbnN0IHJnID0gdGhpcy5yYW5nZShvKTsgWy4uLnRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYScpXS5maWx0ZXIoYSA9PiByZy5pbnRlcnNlY3RzTm9kZShhKSkuZm9yRWFjaChhID0+IHRoaXMudW53cmFwKGEpKTsgdGhpcy50aWR5KCk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChvKTsgcmV0dXJuOyB9XG4gICAgaWYgKG8ucyAhPT0gby5lKSByZXR1cm4gdGhpcy5pbmxpbmUoJ0EnLCBocmVmLCBvKTtcbiAgICBjb25zdCBhID0gdGhpcy51cCh0aGlzLnBvaW50QXQoby5zKVswXSwgJ0EnKTtcbiAgICBpZiAoYSkgeyBhLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpOyB0aGlzLnNldChvKTsgdGhpcy5jb21taXQobyk7IHJldHVybjsgfVxuICAgIGNvbnN0IGxhYmVsID0gaHJlZi5yZXBsYWNlKC9ebWFpbHRvOi9pLCAnJyksIGVuZCA9IHRoaXMuaW5zZXJ0KGxhYmVsLCBvKTtcbiAgICB0aGlzLmNvdmVyZWQoeyBzOiBvLnMsIGU6IGVuZCB9KS5mb3JFYWNoKHQgPT4gdGhpcy53cmFwKHQsICdBJywgaHJlZikpOyB0aGlzLnRpZHkoKTsgdGhpcy5zZXQoeyBzOiBlbmQsIGU6IGVuZCB9KTsgdGhpcy5jb21taXQobyk7XG4gIH1cblxuICAvLyAtLS0tIHN1Z2dlc3Rpb24gLS0tLVxuICBzdWdnZXN0KG86IFJhbmdlMiwga2luZDogJ3N3YXAnIHwgJ2FkZCcpIHtcbiAgICB0aGlzLmZsdXNoKCk7IHRoaXMucGVuZCA9IG51bGw7XG4gICAgY29uc3QgbncgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG53LmNsYXNzTmFtZSA9ICd2by1ydGUtbmV3JzsgbncuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJztcbiAgICBjb25zdCBvbGRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgaWYgKGtpbmQgPT09ICdzd2FwJykge1xuICAgICAgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBhID0gdGhpcy5saW5lQXQoby5zKSwgeiA9IHRoaXMubGluZUF0KG8uZSk7XG4gICAgICBmb3IgKGxldCBpID0gejsgaSA+PSBhOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcyA9IE1hdGgubWF4KG8ucywgdGhpcy5zdGFydE9mKGkpKSwgZSA9IE1hdGgubWluKG8uZSwgdGhpcy5zdGFydE9mKGkpICsgdGhpcy5sZW4oYWxsW2ldKSk7IGlmIChlIDw9IHMpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByZyA9IHRoaXMucmFuZ2UoeyBzLCBlIH0pLCBzcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgc3AuY2xhc3NOYW1lID0gJ3ZvLXJ0ZS1vbGQnO1xuICAgICAgICBzcC5hcHBlbmRDaGlsZChyZy5leHRyYWN0Q29udGVudHMoKSk7IHJnLmluc2VydE5vZGUoc3ApOyBvbGRzLnVuc2hpZnQoc3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2xkcy5sZW5ndGgpIG9sZHNbb2xkcy5sZW5ndGggLSAxXS5hZnRlcihudyk7IGVsc2UgdGhpcy5yYW5nZSh7IHM6IG8uZSwgZTogby5lIH0pLmluc2VydE5vZGUobncpO1xuICAgIHRoaXMucmV2ID0geyBvLCBraW5kLCBvbGRzLCBudyB9O1xuICAgIHJldHVybiAoczogc3RyaW5nKSA9PiB7IGlmICh0aGlzLnJldiAmJiB0aGlzLnJldi5udyA9PT0gbncpIHsgY29uc3QgdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgdy5jbGFzc05hbWUgPSAndm8tdyc7IHcudGV4dENvbnRlbnQgPSBzOyBudy5hcHBlbmRDaGlsZCh3KTsgdGhpcy5zaG93UmFuZ2Uodyk7IH0gfTtcbiAgfVxuICBwcml2YXRlIGRyb3AoKSB7IGlmICghdGhpcy5yZXYpIHJldHVybiBudWxsOyBjb25zdCByID0gdGhpcy5yZXY7IHIub2xkcy5mb3JFYWNoKHggPT4gdGhpcy51bndyYXAoeCkpOyByLm53LnJlbW92ZSgpOyB0aGlzLnJldiA9IG51bGw7IHRoaXMudGlkeSgpOyByZXR1cm4gcjsgfVxuICBhY2NlcHQoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMucmV2ID8gdGhpcy5yZXYubncudGV4dENvbnRlbnQgfHwgJycgOiAnJzsgY29uc3QgciA9IHRoaXMuZHJvcCgpOyBpZiAoIXIpIHJldHVybjtcbiAgICBjb25zdCBpdGVtcyA9IHMuc3BsaXQoL1xcbisvKS5maWx0ZXIoQm9vbGVhbikubWFwKGwgPT4geyBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOyBmcmFnLmFwcGVuZChsKTsgcmV0dXJuIHsgdDogJ3AnLCBmcmFnLCBsZW46IGwubGVuZ3RoIH07IH0pO1xuICAgIGNvbnN0IGF0ID0gdGhpcy5pbnNlcnRMaW5lcyhpdGVtcywgci5raW5kID09PSAnc3dhcCcgPyByLm8gOiB7IHM6IHIuby5lLCBlOiByLm8uZSB9KTtcbiAgICB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy5jb21taXQoci5vKTtcbiAgfVxuICBkaXNjYXJkKCkgeyBjb25zdCByID0gdGhpcy5kcm9wKCk7IGlmIChyKSB0aGlzLnNldChyLm8pOyB0aGlzLmNoYW5nZWQoKTsgfVxuICBuZXdUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJldiA/IHRoaXMucmV2Lm53LnRleHRDb250ZW50IHx8ICcnIDogJyc7IH1cblxuICAvLyAtLS0tIGJyb3dzZXIgZXZlbnRzLCByb3V0ZWQgdGhyb3VnaCB0aGUgZWRpdHMgLS0tLVxuICBwcml2YXRlIG9uQmVmb3JlSW5wdXQoZTogSW5wdXRFdmVudCkge1xuICAgIGNvbnN0IHQgPSBlLmlucHV0VHlwZTtcbiAgICBpZiAodGhpcy5yZXYpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyByZXR1cm47IH1cbiAgICBpZiAodCA9PT0gJ2hpc3RvcnlVbmRvJyB8fCB0ID09PSAnaGlzdG9yeVJlZG8nKSB7IGUucHJldmVudERlZmF1bHQoKTsgaWYgKHQgPT09ICdoaXN0b3J5VW5kbycpIHRoaXMudW5kbygpOyBlbHNlIHRoaXMucmVkbygpOyByZXR1cm47IH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCdmb3JtYXQnKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGlmICh0ID09PSAnZm9ybWF0Qm9sZCcpIHRoaXMuaW5saW5lKCdCJyk7IGVsc2UgaWYgKHQgPT09ICdmb3JtYXRJdGFsaWMnKSB0aGlzLmlubGluZSgnSScpOyByZXR1cm47IH1cbiAgICBpZiAodCA9PT0gJ2luc2VydFBhcmFncmFwaCcgfHwgdCA9PT0gJ2luc2VydExpbmVCcmVhaycpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLnNwbGl0KCk7IHJldHVybjsgfVxuICAgIGlmICh0ID09PSAnaW5zZXJ0RnJvbVBhc3RlJyB8fCB0ID09PSAnaW5zZXJ0RnJvbURyb3AnIHx8IHQgPT09ICdkZWxldGVCeURyYWcnIHx8IHQgPT09ICdkZWxldGVCeUN1dCcpIHJldHVybjtcbiAgICBjb25zdCBvID0gdGhpcy5nZXQoKSwgaSA9IHRoaXMubGluZUF0KG8ucyk7XG4gICAgaWYgKHQgPT09ICdpbnNlcnRUZXh0JyAmJiBlLmRhdGEgJiYgdGhpcy5wZW5kICYmIG8ucyA9PT0gby5lICYmIHRoaXMucGVuZC5hdCA9PT0gby5zKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy50eXBlU3R5bGVkKGUuZGF0YSk7IHJldHVybjsgfVxuICAgIGlmIChvLnMgPT09IG8uZSAmJiAvXmRlbGV0ZS4qQmFja3dhcmQkLy50ZXN0KHQpICYmIG8ucyA9PT0gdGhpcy5zdGFydE9mKGkpKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5mbHVzaCgpOyB0aGlzLmpvaW5CYWNrKG8pOyByZXR1cm47IH1cbiAgICBpZiAoby5zID09PSBvLmUgJiYgL15kZWxldGUuKkZvcndhcmQkLy50ZXN0KHQpICYmIG8ucyA9PT0gdGhpcy5zdGFydE9mKGkpICsgdGhpcy5sZW4odGhpcy5saW5lcygpW2ldKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHRoaXMuZmx1c2goKTsgdGhpcy5qb2luTmV4dChvKTsgcmV0dXJuOyB9XG4gICAgaWYgKG8ucyAhPT0gby5lICYmIGkgIT09IHRoaXMubGluZUF0KG8uZSkgJiYgKHQuc3RhcnRzV2l0aCgnZGVsZXRlJykgfHwgdCA9PT0gJ2luc2VydFRleHQnIHx8IHQgPT09ICdpbnNlcnRSZXBsYWNlbWVudFRleHQnKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmZsdXNoKCk7IGNvbnN0IHAgPSB0aGlzLmRlbChvKTsgbGV0IGF0ID0gcC5zO1xuICAgICAgY29uc3QgcyA9IGUuZGF0YSB8fCAoZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9wbGFpbicpKSB8fCAnJztcbiAgICAgIGlmIChzICYmIHQuc3RhcnRzV2l0aCgnaW5zZXJ0JykpIGF0ID0gdGhpcy5pbnNlcnQocy5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCAnICcpLCBwKTtcbiAgICAgIHRoaXMuc2V0KHsgczogYXQsIGU6IGF0IH0pOyB0aGlzLmNvbW1pdChvKTsgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuSC5kaXJ0eSkgdGhpcy5ILnByZSA9IG87XG4gIH1cbiAgcHJpdmF0ZSBvbkRyb3AoZTogRHJhZ0V2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBpZiAodGhpcy5yZXYgfHwgIWUuZGF0YVRyYW5zZmVyKSByZXR1cm47XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnBsYWluKGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKSk7IGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgRG9jdW1lbnQgJiB7IGNhcmV0UmFuZ2VGcm9tUG9pbnQ/OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFJhbmdlIHwgbnVsbDsgY2FyZXRQb3NpdGlvbkZyb21Qb2ludD86ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4geyBvZmZzZXROb2RlOiBOb2RlOyBvZmZzZXQ6IG51bWJlciB9IHwgbnVsbCB9O1xuICAgIGxldCBhdDogW05vZGUsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHsgY29uc3QgcHAgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7IGlmIChwcCkgYXQgPSBbcHAub2Zmc2V0Tm9kZSwgcHAub2Zmc2V0XTsgfVxuICAgIGVsc2UgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7IGNvbnN0IHIgPSBkb2MuY2FyZXRSYW5nZUZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7IGlmIChyKSBhdCA9IFtyLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0XTsgfVxuICAgIGlmICghYXQgfHwgIXRoaXMuZWQuY29udGFpbnMoYXRbMF0pKSByZXR1cm47XG4gICAgdGhpcy5mbHVzaCgpOyBjb25zdCBhMCA9IHRoaXMub2Zmc2V0T2YoYXRbMF0sIGF0WzFdKSwgZW5kID0gdGhpcy5pbnNlcnRMaW5lcyhpdGVtcywgeyBzOiBhMCwgZTogYTAgfSk7IHRoaXMuc2V0KHsgczogZW5kLCBlOiBlbmQgfSwgdHJ1ZSk7IHRoaXMuY29tbWl0KHsgczogYTAsIGU6IGEwIH0pO1xuICB9XG4gIHByaXZhdGUgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5pc0NvbXBvc2luZyB8fCB0aGlzLmhvb2sua2V5Py4oZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZXYpIHJldHVybjtcbiAgICBjb25zdCBtb2QgPSBpc01hYygpID8gZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgOiBlLmN0cmxLZXkgJiYgIWUubWV0YUtleTtcbiAgICBpZiAoIW1vZCkgcmV0dXJuO1xuICAgIGNvbnN0IGsgPSBlLmtleS50b0xvd2VyQ2FzZSgpLCBjID0gZS5jb2RlO1xuICAgIGNvbnN0IGFjdCA9IGUuYWx0S2V5ID8gKGMgPT09ICdEaWdpdDEnID8gKCkgPT4gdGhpcy5ibG9jaygnaDInKSA6IGMgPT09ICdEaWdpdDAnID8gKCkgPT4gdGhpcy5ibG9jaygncCcpIDogbnVsbClcbiAgICAgIDogZS5zaGlmdEtleSA/IChjID09PSAnRGlnaXQ3JyA/ICgpID0+IHRoaXMuYmxvY2soJ29sJykgOiBjID09PSAnRGlnaXQ4JyA/ICgpID0+IHRoaXMuYmxvY2soJ3VsJykgOiBjID09PSAnRGlnaXQ5JyA/ICgpID0+IHRoaXMuYmxvY2soJ3F1b3RlJykgOiBrID09PSAneicgPyAoKSA9PiB0aGlzLnJlZG8oKSA6IG51bGwpXG4gICAgICA6IGsgPT09ICdiJyA/ICgpID0+IHRoaXMuaW5saW5lKCdCJykgOiBrID09PSAnaScgPyAoKSA9PiB0aGlzLmlubGluZSgnSScpIDogayA9PT0gJ2UnID8gKCkgPT4gdGhpcy5pbmxpbmUoJ0NPREUnKSA6IGsgPT09ICd6JyA/ICgpID0+IHRoaXMudW5kbygpIDogayA9PT0gJ3knID8gKCkgPT4gdGhpcy5yZWRvKCkgOiBudWxsO1xuICAgIGlmIChhY3QpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBhY3QoKTsgfVxuICB9XG5cbiAgLy8gLS0tLSBwdWJsaWMgaGVscGVycyB1c2VkIGJ5IHRoZSBjb21wb25lbnQgLS0tLVxuICBmb2N1cygpIHsgdGhpcy5zZXQodGhpcy5nZXQoKSwgdHJ1ZSk7IH1cbiAgaHRtbCgpIHsgcmV0dXJuIHRoaXMuZWQuaW5uZXJIVE1MOyB9XG4gIHJldmlld2luZygpIHsgcmV0dXJuICEhdGhpcy5yZXY7IH1cbiAgY2FuVW5kbygpIHsgcmV0dXJuIHRoaXMuSC5hdCA+IDAgfHwgdGhpcy5ILmRpcnR5OyB9XG4gIGNhblJlZG8oKSB7IHJldHVybiB0aGlzLkguYXQgPCB0aGlzLkgubGlzdC5sZW5ndGggLSAxOyB9XG4gIGVtcHR5KCkgeyBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCk7IHJldHVybiBhbGwubGVuZ3RoID09PSAxICYmICF0aGlzLmxlbihhbGxbMF0pICYmIHRoaXMudHlwZU9mKGFsbFswXSkgPT09ICdwJzsgfVxuICB3b3JkcygpIHsgY29uc3QgcyA9IHRoaXMubGluZXMoKS5tYXAoYiA9PiBiLnRleHRDb250ZW50KS5qb2luKCcgJykudHJpbSgpOyByZXR1cm4gcyA/IHMuc3BsaXQoL1xccysvKS5sZW5ndGggOiAwOyB9XG4gIGxpbmUoYXQ6IG51bWJlcik6IFJhbmdlMiB7IGNvbnN0IGkgPSB0aGlzLmxpbmVBdChhdCksIHMgPSB0aGlzLnN0YXJ0T2YoaSk7IHJldHVybiB7IHMsIGU6IHMgKyB0aGlzLmxlbih0aGlzLmxpbmVzKClbaV0pIH07IH1cbiAgc3RhdGUoKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuZ2V0KCksIGFsbCA9IHRoaXMubGluZXMoKSwgdHMgPSBhbGwuc2xpY2UodGhpcy5saW5lQXQoby5zKSwgdGhpcy5saW5lQXQoby5lKSArIDEpLm1hcChiID0+IHRoaXMudHlwZU9mKGIpKSwgZyA9IHRoaXMubGl2ZSgpO1xuICAgIGNvbnN0IGEgPSB0aGlzLnVwKG8ucyA9PT0gby5lICYmIGcgPyBnLnN0YXJ0Q29udGFpbmVyIDogdGhpcy5wb2ludEF0KG8ucywgby5zICE9PSBvLmUpWzBdLCAnQScpO1xuICAgIHJldHVybiB7IEI6IHRoaXMuaGFzKCdCJywgbyksIEk6IHRoaXMuaGFzKCdJJywgbyksIENPREU6IHRoaXMuaGFzKCdDT0RFJywgbyksIEE6IG8ucyA9PT0gby5lID8gISFhIDogdGhpcy5oYXMoJ0EnLCBvKSwgaHJlZjogYSA/IGEuZ2V0QXR0cmlidXRlKCdocmVmJykgOiBudWxsLCBibG9jazogdHMuZXZlcnkodCA9PiB0ID09PSB0c1swXSkgPyB0c1swXSA6IG51bGwgfTtcbiAgfVxuICByZW1vdmUobzogUmFuZ2UyKSB7IHRoaXMuZmx1c2goKTsgdGhpcy5zZXQodGhpcy5kZWwobykpOyB0aGlzLmNvbW1pdChvKTsgfVxuICB0eXBlKHM6IHN0cmluZykgeyBjb25zdCBvID0gdGhpcy5nZXQoKTsgdGhpcy5mbHVzaCgpOyBjb25zdCBhdCA9IHRoaXMuaW5zZXJ0KHMsIG8pOyB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy50eXBlZChvKTsgdGhpcy5zaG93UmFuZ2UodGhpcy5yYW5nZSh7IHM6IGF0LCBlOiBhdCB9KSk7IH1cbiAgc2hvdyhvOiBSYW5nZTIpIHsgdGhpcy5zaG93UmFuZ2UodGhpcy5yYW5nZShvKSk7IH1cbiAgZGVzdHJveSgpIHsgY2xlYXJUaW1lb3V0KHRoaXMuSC50KTsgdGhpcy5vZmZzLmZvckVhY2goZiA9PiBmKCkpOyB0aGlzLm9mZnMgPSBbXTsgfVxufVxuXG4vKiAtLS0tLS0tLS0tIHRoZSBkZW1vJ3Mgd3JpdGVyOiBjYW5uZWQgcmV3cml0ZXMgZm9yIHRoZSBwcmV2aWV3J3MgZHJhZnQsIGFuZCBzaW1wbGUgcnVsZXMgZm9yIGFueXRoaW5nIGVsc2UgLS0tLS0tLS0tLSAqL1xuY29uc3QgQ0FOTkVEOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgJ1dlIGtub3cgcHJpY2luZyBjaGFuZ2VzIGNhbiBmZWVsIGxpa2UgYSBsb3QsIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGhhcyBwbGVudHkgb2YgdGltZSB0byBsb29rIGF0IHRoZSBuZXcgcGxhbnMgYW5kIGFzayB1cyBxdWVzdGlvbnMgYmVmb3JlIGFueXRoaW5nIGNoYW5nZXMuJzpcbiAgICB7IHNob3J0ZXI6IFwiV2UncmUgZ2l2aW5nIGV2ZXJ5b25lIHRpbWUgdG8gcmV2aWV3IHRoZSBuZXcgcGxhbnMgYW5kIGFzayBxdWVzdGlvbnMgYmVmb3JlIGFueXRoaW5nIGNoYW5nZXMuXCIsIGltcHJvdmU6ICdQcmljaW5nIGNoYW5nZXMgY2FuIGZlZWwgbGlrZSBhIGxvdCwgc28gZXZlcnlvbmUgZ2V0cyBwbGVudHkgb2YgdGltZSB0byByZXZpZXcgdGhlIG5ldyBwbGFucyBhbmQgYXNrIHF1ZXN0aW9ucyBiZWZvcmUgYW55dGhpbmcgY2hhbmdlcy4nIH0sXG4gICdOZXcgcHJpY2luZyBnb2VzIGxpdmUgb24gTWFyY2ggMy4nOiB7IGltcHJvdmU6ICdPdXIgbmV3IHByaWNpbmcgZ29lcyBsaXZlIG9uIE1hcmNoIDMuJywgc2hvcnRlcjogJ05ldyBwcmljaW5nIHN0YXJ0cyBNYXJjaCAzLicgfSxcbiAgJ1N0YXJ0ZXIgdGVhbXMgZ2V0IHR3byBtb3JlIHNlYXRzIGZvciBmcmVlLCBhbmQgZXZlcnkgcGxhbiBub3cgaW5jbHVkZXMgdGhlIGFnZW50Lic6IHsgaW1wcm92ZTogJ1N0YXJ0ZXIgdGVhbXMgZ2V0IHR3byBleHRyYSBzZWF0cyBhdCBubyBjb3N0LCBhbmQgZXZlcnkgcGxhbiBub3cgaW5jbHVkZXMgdGhlIGFnZW50LicsIHNob3J0ZXI6ICdTdGFydGVyIHRlYW1zIGdldCB0d28gZnJlZSBzZWF0cywgYW5kIGV2ZXJ5IHBsYW4gaW5jbHVkZXMgdGhlIGFnZW50LicgfSxcbn07XG5jb25zdCBUWVBPOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyB0ZWg6ICd0aGUnLCByZWNpZXZlOiAncmVjZWl2ZScsIHNlcGVyYXRlOiAnc2VwYXJhdGUnLCBkZWZpbmF0ZWx5OiAnZGVmaW5pdGVseScsIGFsb3Q6ICdhIGxvdCcsIGRvbnQ6IFwiZG9uJ3RcIiwgY2FudDogXCJjYW4ndFwiLCB3b250OiBcIndvbid0XCIsIGltOiBcIkknbVwiLCBpdmU6IFwiSSd2ZVwiLCB0aGllcjogJ3RoZWlyJywgdW50aWxsOiAndW50aWwnLCBvY2N1cmVkOiAnb2NjdXJyZWQnLCB3aWNoOiAnd2hpY2gnLCBiZWN1YXNlOiAnYmVjYXVzZScsIHlvdXJlOiBcInlvdSdyZVwiLCBkb2VzbnQ6IFwiZG9lc24ndFwiLCBpc250OiBcImlzbid0XCIsIHRvbW1vcm93OiAndG9tb3Jyb3cnLCBhY2Nyb3NzOiAnYWNyb3NzJyB9O1xuY29uc3QgRklMTEVSOiBbUmVnRXhwLCBzdHJpbmddW10gPSBbWy9cXGIocmVhbGx5fHZlcnl8anVzdHxhY3R1YWxseXxiYXNpY2FsbHl8cXVpdGV8c2ltcGx5fGRlZmluaXRlbHl8Y2VydGFpbmx5fGxpdGVyYWxseXx0b3RhbGx5KVxccysvZ2ksICcnXSwgWy9cXGJpbiBvcmRlciB0b1xcYi9naSwgJ3RvJ10sIFsvXFxibWFrZSBzdXJlICh0aGF0ICk/L2dpLCAnZW5zdXJlICddLCBbL1xcYmR1ZSB0byB0aGUgZmFjdCB0aGF0XFxiL2dpLCAnYmVjYXVzZSddLCBbL1xcYmF0IHRoaXMgcG9pbnQgaW4gdGltZVxcYi9naSwgJ25vdyddLCBbL1xcYmEgbG90IG9mXFxiL2dpLCAnbWFueSddLCBbL1xcYnBsZW50eSBvZlxcYi9naSwgJ2Vub3VnaCddLCBbL1xcYmlzIGFibGUgdG9cXGIvZ2ksICdjYW4nXV07XG5jb25zdCBCRVRURVI6IFtSZWdFeHAsIHN0cmluZ11bXSA9IFtbL1xcYndlIHdpbGxcXGIvZ2ksIFwid2UnbGxcIl0sIFsvXFxid2UgYXJlXFxiL2dpLCBcIndlJ3JlXCJdLCBbL1xcYml0IGlzXFxiL2dpLCBcIml0J3NcIl0sIFsvXFxiZG8gbm90XFxiL2dpLCBcImRvbid0XCJdLCBbL1xcYmNhbm5vdFxcYi9naSwgXCJjYW4ndFwiXSwgWy9cXGJ2ZXJ5IGltcG9ydGFudFxcYi9naSwgJ2Vzc2VudGlhbCddLCBbL1xcYmdvb2RcXGIvZ2ksICdzdHJvbmcnXSwgWy9cXGJiaWdcXGIvZ2ksICdtYWpvciddLCBbL1xcYnN0dWZmXFxiL2dpLCAnZGV0YWlscyddLCBbL1xcYmtpbmQgb2ZcXHMrL2dpLCAnJ10sIFsvXFxiYXQgbm8gZXh0cmEgY29zdFxcYi9naSwgJ2ZyZWUnXV07XG4vKiogVGhlIGRlbW8ncyBzdGFuZC1pbiBmb3IgYSBtb2RlbDogY2FubmVkIHJld3JpdGVzIGZvciB0aGUgcHJldmlldydzIGRyYWZ0IGFib3V0IGEgcHJpY2luZyBsYXVuY2gsIGFuZCBzaW1wbGUgcnVsZXMgZm9yIGFueXRoaW5nIGVsc2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW1vV3JpdGUoYWN0aW9uOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgZG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmaXggPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoL1sgXFx0XXsyLH0vZywgJyAnKS5yZXBsYWNlKC9cXHMrKFssLiE/OzpdKS9nLCAnJDEnKS5yZXBsYWNlKC9cXGJpXFxiL2csICdJJylcbiAgICAucmVwbGFjZSgvXFxiW2Etel0rXFxiL2dpLCB3ID0+IHsgY29uc3QgZiA9IFRZUE9bdy50b0xvd2VyQ2FzZSgpXTsgcmV0dXJuIGYgPyAod1swXSA9PT0gd1swXS50b1VwcGVyQ2FzZSgpID8gZlswXS50b1VwcGVyQ2FzZSgpICsgZi5zbGljZSgxKSA6IGYpIDogdzsgfSlcbiAgICAucmVwbGFjZSgvKF58Wy4hP11cXHMrKShbYS16XSkvZywgKF8sIGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBhICsgYi50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC8oW2EtejAtOV0pXFxzKiQvaSwgKG0sIGE6IHN0cmluZykgPT4gcy50cmltKCkuc3BsaXQoL1xccysvKS5sZW5ndGggPiAzID8gYSArICcuJyA6IG0pO1xuICBpZiAoYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgY29uc3QgbmV4dCA9IC9wcmljfHBsYW58c2VhdHxsYXVuY2gvaS50ZXN0KGRvYylcbiAgICAgID8gWydDdXJyZW50IGN1c3RvbWVycyBrZWVwIHRoZWlyIHByaWNlIHVudGlsIHRoZWlyIG5leHQgcmVuZXdhbCwgYW5kIGV2ZXJ5IGFkbWluIGdldHMgYW4gZW1haWwgdGhhdCBzdW1zIHVwIHdoYXQgY2hhbmdlcyBmb3IgdGhlaXIgdGVhbS4nLCAnSWYgYW55dGhpbmcgaXMgdW5jbGVhciwgcmVwbHkgdG8gdGhpcyBlbWFpbCBhbmQgd2Ugd2lsbCB3YWxrIHlvdSB0aHJvdWdoIGl0LiddXG4gICAgICA6IFsnTmV4dCwgd2Ugd2lsbCBzaGFyZSBhIHNob3J0IHN1bW1hcnkgc28gZXZlcnlvbmUga25vd3Mgd2hhdCBjaGFuZ2VzIGFuZCB3aGVuLicsICdSZXBseSB3aXRoIGFueSBxdWVzdGlvbnMgYW5kIHdlIHdpbGwgZ2V0IGJhY2sgdG8geW91IHdpdGhpbiBhIGRheS4nXTtcbiAgICByZXR1cm4gbmV4dC5maW5kKHggPT4gIWRvYy5pbmNsdWRlcyh4KSkgfHwgbmV4dFtuZXh0Lmxlbmd0aCAtIDFdO1xuICB9XG4gIGlmIChhY3Rpb24gPT09ICdncmFtbWFyJykgcmV0dXJuIGZpeCh0ZXh0KTtcbiAgY29uc3QgcnVsZXMgPSAoczogc3RyaW5nLCBsaXN0OiBbUmVnRXhwLCBzdHJpbmddW10pID0+IGxpc3QucmVkdWNlKCh4LCBbYSwgYl0pID0+IHgucmVwbGFjZShhLCBiKSwgcyk7XG4gIHJldHVybiAodGV4dC5tYXRjaCgvW15dKj8oPzpbLiE/XSsoPz1cXHN8JCl8JClcXHMqL2cpIHx8IFt0ZXh0XSkuZmlsdGVyKEJvb2xlYW4pLm1hcChzID0+IHtcbiAgICBjb25zdCBrID0gcy50cmltKCksIGhpdCA9IENBTk5FRFtrXSAmJiBDQU5ORURba11bYWN0aW9uXTsgaWYgKGhpdCkgcmV0dXJuIHMucmVwbGFjZShrLCBoaXQpO1xuICAgIGxldCB4ID0gZml4KHJ1bGVzKHMsIGFjdGlvbiA9PT0gJ3Nob3J0ZXInID8gRklMTEVSIDogWy4uLkZJTExFUi5zbGljZSgwLCAyKSwgLi4uQkVUVEVSXSkpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzaG9ydGVyJyAmJiB4LnRyaW0oKS5sZW5ndGggPiA2MCAmJiB4Lmxlbmd0aCA+IHMubGVuZ3RoICogLjg1ICYmIHguaW5jbHVkZXMoJywgJykpIHggPSB4LnNsaWNlKDAsIHguaW5kZXhPZignLCAnKSkgKyAnLicgKyAoL1xccyQvLnRlc3QocykgPyAnICcgOiAnJyk7XG4gICAgcmV0dXJuIHg7XG4gIH0pLmpvaW4oJycpO1xufVxuLyoqIFRoZSBkZWZhdWx0IGBhaWA6IGRlbW9Xcml0ZSdzIGFuc3dlciwgc3RyZWFtZWQgYSB3b3JkIGF0IGEgdGltZSBhZnRlciBhIHNob3J0IHBhdXNlLCBhcyBhIG1vZGVsIHdvdWxkICovXG5leHBvcnQgY29uc3QgZGVtb0FpOiBSaWNoVGV4dEFpID0gYXN5bmMgZnVuY3Rpb24qICh7IGFjdGlvbiwgdGV4dCwgZG9jdW1lbnQ6IGRvYywgc2lnbmFsIH0pIHtcbiAgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZTx2b2lkPihyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG4gIGNvbnN0IHJlZHVjZSA9IHR5cGVvZiBtYXRjaE1lZGlhICE9PSAndW5kZWZpbmVkJyAmJiBtYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7XG4gIGNvbnN0IG91dCA9IGRlbW9Xcml0ZShhY3Rpb24sIHRleHQsIGRvYyk7XG4gIGlmIChyZWR1Y2UpIHsgeWllbGQgb3V0OyByZXR1cm47IH1cbiAgYXdhaXQgd2FpdCg0NTApO1xuICBmb3IgKGNvbnN0IHcgb2Ygb3V0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpIHx8IFtdKSB7IGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuOyB5aWVsZCB3OyBhd2FpdCB3YWl0KDQ4KTsgfVxufTtcblxuY29uc3QgQUNUSU9OUzogUmljaFRleHRBaUFjdGlvbltdID0gW1xuICB7IGtleTogJ2ltcHJvdmUnLCBsYWJlbDogJ0ltcHJvdmUgd3JpdGluZycsIGljb246ICdzcGFyaycgfSxcbiAgeyBrZXk6ICdzaG9ydGVyJywgbGFiZWw6ICdNYWtlIHNob3J0ZXInLCBpY29uOiAnbWludXMnIH0sXG4gIHsga2V5OiAnZ3JhbW1hcicsIGxhYmVsOiAnRml4IGdyYW1tYXInLCBpY29uOiAnY2hlY2snIH0sXG4gIHsga2V5OiAnY29udGludWUnLCBsYWJlbDogJ0NvbnRpbnVlIHdyaXRpbmcnLCBpY29uOiAnZWRpdCcsIGtpbmQ6ICdhZGQnIH0sXG5dO1xuY29uc3Qga2V5c09mID0gKGs6IHN0cmluZywgbWFjOiBib29sZWFuKSA9PiBrID09PSAncmVkbycgPyAobWFjID8gJ+KHp+KMmFonIDogJ0N0cmwrWScpXG4gIDogay5zcGxpdCgnICcpLm1hcCh4ID0+ICgoeyBtb2Q6IG1hYyA/ICfijJgnIDogJ0N0cmwnLCBhbHQ6IG1hYyA/ICfijKUnIDogJ0FsdCcsIHNoaWZ0OiBtYWMgPyAn4oenJyA6ICdTaGlmdCcgfSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbeF0gfHwgeCkuam9pbihtYWMgPyAnJyA6ICcrJyk7XG5jb25zdCBUT09MUzogeyBmOiBSaWNoVGV4dEZvcm1hdCB8ICdhJzsgbGFiZWw6IHN0cmluZzsgaWNvbjogVm9JY29uTmFtZTsgazogc3RyaW5nIH1bXSA9IFtcbiAgeyBmOiAnaDInLCBsYWJlbDogJ0hlYWRpbmcnLCBpY29uOiAnZmlsZS10ZXh0JywgazogJ21vZCBhbHQgMScgfSwgeyBmOiAnYicsIGxhYmVsOiAnQm9sZCcsIGljb246ICdlZGl0JywgazogJ21vZCBCJyB9LCB7IGY6ICdpJywgbGFiZWw6ICdJdGFsaWMnLCBpY29uOiAncHInLCBrOiAnbW9kIEknIH0sXG4gIHsgZjogJ2NvZGUnLCBsYWJlbDogJ0lubGluZSBjb2RlJywgaWNvbjogJ3Rlcm0nLCBrOiAnbW9kIEUnIH0sIHsgZjogJ2EnLCBsYWJlbDogJ0xpbmsnLCBpY29uOiAnZXh0JywgazogJ21vZCBLJyB9LFxuICB7IGY6ICd1bCcsIGxhYmVsOiAnQnVsbGV0ZWQgbGlzdCcsIGljb246ICdtb3JlJywgazogJ21vZCBzaGlmdCA4JyB9LCB7IGY6ICdvbCcsIGxhYmVsOiAnTnVtYmVyZWQgbGlzdCcsIGljb246ICdtb3JlJywgazogJ21vZCBzaGlmdCA3JyB9LCB7IGY6ICdxdW90ZScsIGxhYmVsOiAnUXVvdGUnLCBpY29uOiAnY29tbWVudCcsIGs6ICdtb2Qgc2hpZnQgOScgfSxcbl07XG50eXBlIEpvYiA9IHsgbzogUmFuZ2UyOyB0OiBSYW5nZTI7IHNsYXNoOiBudW1iZXIgfCBudWxsOyBzZWw6IGJvb2xlYW47IGJ0bj86IGJvb2xlYW4gfTtcblxuLyoqIEEgbWluaW1hbCBlZGl0b3IgZm9yIGEgZHJhZnQgYW4gYWdlbnQgaGVscHMgd2l0aC4gU2VsZWN0IHRleHQgYW5kIHByZXNzIEFzayBBSSAob3IgTW9kK0osIG9yIHR5cGUgLyBvbiBhIG5ldyBsaW5lKSwgYW5kIGFcbiAgICBzdWdnZXN0aW9uIHN0cmVhbXMgaW4gYmVzaWRlIHRoZSB0ZXh0LCB0aGUgb2xkIHdvcmRzIHN0cnVjayB0aHJvdWdoLCB0byBhY2NlcHQgd2l0aCBUYWIvRW50ZXIgb3IgZGlzY2FyZCB3aXRoIEVzY2FwZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLXJpY2gtdGV4dC1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBkYXRhLXZvPVwiXCJcbiAgICAgICNyb290XG4gICAgICBjbGFzcz1cInZvLXJ0ZVwiXG4gICAgICBbYXR0ci5kYXRhLXN0XT1cInJldmlldyA/ICdyZXZpZXcnIDogJ2VkaXQnXCJcbiAgICAgIChrZXlkb3duKT1cIm9uUm9vdEtleSgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJvblJvb3RQb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICN0YlxuICAgICAgICBjbGFzcz1cInZvLXJ0ZS10YlwiXG4gICAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkZvcm1hdHRpbmdcIlxuICAgICAgICAobW91c2Vkb3duKT1cImtlZXBGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwidGJLZXkoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKHQgb2YgdG9vbHM7IHRyYWNrIHQuZjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICBAaWYgKGkgPT09IDUpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcnRlLXNlcFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1iXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJ0LmYgPT09ICdhJyAmJiB0Lm9uICYmICFyZXZpZXdcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1mXT1cInQuZlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQubGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidC5sYWJlbCArICcgwrcgJyArIHQua2JkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXJldmlld1wiXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9jdXNUYiA9PT0gaSA/IDAgOiAtMVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInQuZiA9PT0gJ2EnID8gJ2RpYWxvZycgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidC5mID09PSAnYScgPyAhIWxrIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwidC5mICE9PSAnYScgPyAoIXJldmlldyAmJiB0Lm9uKSA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5KHQuZiwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwidC5pY29uXCIgc2l6ZT1cIm1kXCI+PC92by1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BcIj48L3NwYW4+XG4gICAgICAgIEBpZiAoYWkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1haVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQXNrIEFJXCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiISFqb2JcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ0VkaXQgb3Igd3JpdGUgd2l0aCBBSSDCtyAnICsgYWlLYmRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhcmV2aWV3XCJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb2N1c1RiID09PSB0b29scy5sZW5ndGggPyAwIDogLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWlCdXR0b24oJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInNwYXJrXCI+PC92by1pY29uPjxzcGFuPkFzayBBSTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlcbiAgICAgICAgY2xhc3M9XCJ2by1ydGUtYm9keVwiXG4gICAgICAgIFtjbGFzcy52by1lbXB0eV09XCJlbXB0eSAmJiAhcmV2aWV3XCJcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG4gICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgc3BlbGxjaGVjaz1cInRydWVcIlxuICAgICAgPjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tcnRlLWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ydGUtaWRsZVwiIChtb3VzZWRvd24pPVwia2VlcEZvY3VzKCRldmVudClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXJ0ZS13YyB2by1udW1cIj57eyB3b3JkcyA9PT0gMSA/ICcxIHdvcmQnIDogd29yZHMgKyAnIHdvcmRzJyB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKGFpICE9PSBmYWxzZSAmJiBoaW50KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXJ0ZS1oaW50XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS11blwiIGFyaWEtbGFiZWw9XCJVbmRvXCIgW2F0dHIudGl0bGVdPVwiJ1VuZG8gwrcgJyArIHVuZG9LYmRcIiBbZGlzYWJsZWRdPVwiISFyZXZpZXcgfHwgIWNhblVuZG9cIiAoY2xpY2spPVwiZG9VbmRvKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwidW5kb1wiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS1yZVwiIGFyaWEtbGFiZWw9XCJSZWRvXCIgW2F0dHIudGl0bGVdPVwiJ1JlZG8gwrcgJyArIHJlZG9LYmRcIiBbZGlzYWJsZWRdPVwiISFyZXZpZXcgfHwgIWNhblJlZG9cIiAoY2xpY2spPVwiZG9SZWRvKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwicmVkb1wiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ydGUtcmV2XCIgKG1vdXNlZG93bik9XCJrZWVwRm9jdXMoJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcnRlLXN0XCI+XG4gICAgICAgICAgICBAaWYgKHJldmlldyAmJiAhcmV2aWV3LnJlYWR5KSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGhpbmsgdm8tb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aT48L2k+PGk+PC9pPjxpPjwvaT48aT48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNoaW1cIj57eyByZXZpZXdMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKHJldmlldykge1xuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIj48L3ZvLWljb24+PHNwYW4+U3VnZ2VzdGlvbiByZWFkeTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tZ2hvc3Qgdm8tc20gdm8tcnRlLW5vXCIgKGNsaWNrKT1cImZpbmlzaChmYWxzZSwgJGV2ZW50LmlzVHJ1c3RlZClcIj5EaXNjYXJkPHNwYW4gY2xhc3M9XCJ2by1rYmRcIj5Fc2M8L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWFjY2VudCB2by1zbSB2by1ydGUtb2tcIiBbZGlzYWJsZWRdPVwiIXJldmlldz8ucmVhZHlcIiAoY2xpY2spPVwiZmluaXNoKHRydWUsICRldmVudC5pc1RydXN0ZWQpXCI+QWNjZXB0PHNwYW4gY2xhc3M9XCJ2by1rYmRcIj5UYWI8L3NwYW4+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoYWkgIT09IGZhbHNlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAjYXNrRWxcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1hc2tcIlxuICAgICAgICAgIFtjbGFzcy52by1zaG93XT1cImJ1YmJsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFzayBBSSBhYm91dCB0aGUgc2VsZWN0aW9uXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Bc2tCdXR0b24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIj48L3ZvLWljb24+PHNwYW4+QXNrIEFJPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgI21lbnVFbFxuICAgICAgICAgIGNsYXNzPVwidm8tcG9wIHZvLXJ0ZS1tZW51XCJcbiAgICAgICAgICBbY2xhc3Mudm8tb3Blbl09XCIhIWpvYlwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aWQgKyAnLXBoJ1wiXG4gICAgICAgICAgW2F0dHIuaW5lcnRdPVwiam9iID8gbnVsbCA6ICcnXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJtZW51S2V5KCRldmVudClcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXBoXCIgW2lkXT1cInVpZCArICctcGgnXCI+e3sgbWVudUhlYWRpbmcgfX08L2Rpdj5cbiAgICAgICAgICBAZm9yIChhIG9mIGl0ZW1zOyB0cmFjayBhLmtleSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1taVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFdPVwiYS5rZXlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImEub2ZmXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWVudUl0ZW0oYSwgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoYS5pY29uKSB7IDx2by1pY29uIFtuYW1lXT1cImEuaWNvblwiPjwvdm8taWNvbj4gfVxuICAgICAgICAgICAgICA8c3Bhbj57eyBhLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICAjbG5rRWxcbiAgICAgICAgY2xhc3M9XCJ2by1wb3Agdm8tcnRlLWxua1wiXG4gICAgICAgIFtjbGFzcy52by1vcGVuXT1cIiEhbGtcIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkxpbmtcIlxuICAgICAgICBbYXR0ci5pbmVydF09XCJsayA/IG51bGwgOiAnJ1wiXG4gICAgICAgIChrZXlkb3duKT1cImxua0tleSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cImxua0JsdXIoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICN1cmxFbFxuICAgICAgICAgIGNsYXNzPVwidm8tcnRlLXVybFwiXG4gICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJQYXN0ZSBvciB0eXBlIGEgbGlua1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkxpbmsgYWRkcmVzc1wiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ1cmxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJiYWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAoaW5wdXQpPVwib25VcmxJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWFjY2VudCB2by1zbSB2by1ydGUtbG9rXCIgKGNsaWNrKT1cImFwcGx5TGluaygnJylcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICBAaWYgKGhhc0hyZWYgJiYgbGspIHtcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS1scm1cIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIGxpbmtcIiB0aXRsZT1cIlJlbW92ZSBsaW5rXCIgKGNsaWNrKT1cImFwcGx5TGluayhudWxsKVwiPjx2by1pY29uIG5hbWU9XCJ0cmFzaFwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwIGNsYXNzPVwidm8tcnRlLWxpdmVcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyBzYXkgfX08L3A+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9yaWNoLXRleHQtZWRpdG9yLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFJpY2hUZXh0RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIHRleHQgYXMgSFRNTDogcGFyYWdyYXBocywgb25lIGhlYWRpbmcgbGV2ZWwgKGBoMmApLCBsaXN0cywgcXVvdGVzIGFuZCBpbnNpZGUgdGhlbSBib2xkL2l0YWxpYy9jb2RlL2xpbmtzLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1dyaXRlIGEgZHJhZnQsIG9yIHR5cGUgLyBvbiBhIG5ldyBsaW5lIGZvciBBSSc7XG4gIEBJbnB1dCgpIGxhYmVsID0gJ0RyYWZ0JztcbiAgQElucHV0KCkgaGludDogc3RyaW5nIHwgbnVsbCA9ICdTZWxlY3QgdGV4dCB0byBhc2sgQUknO1xuICAvKiogV3JpdGVzIHRoZSBBSSdzIHN1Z2dlc3Rpb25zLiBEZWZhdWx0cyB0byB0aGUgZGVtbyB3cml0ZXI7IHBhc3MgeW91ciBtb2RlbCBjYWxsLCBvciBmYWxzZSB0byBoaWRlIHRoZSBBSSAqL1xuICBASW5wdXQoKSBhaTogUmljaFRleHRBaSB8IGZhbHNlID0gZGVtb0FpO1xuICAvKiogVGhlIEFJIG1lbnUuIERlZmF1bHRzIHRvIEltcHJvdmUgd3JpdGluZywgTWFrZSBzaG9ydGVyLCBGaXggZ3JhbW1hciBhbmQgQ29udGludWUgd3JpdGluZyAqL1xuICBASW5wdXQoKSBhaUFjdGlvbnM6IFJpY2hUZXh0QWlBY3Rpb25bXSA9IEFDVElPTlM7XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSBIVE1MIGFmdGVyIGVhY2ggY2hhbmdlIHRoZSBwZXJzb24gbWFrZXMgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBDYWxsZWQgd2hlbiBhIHN1Z2dlc3Rpb24gaXMgYWNjZXB0ZWQgb3IgZGlzY2FyZGVkICovXG4gIEBPdXRwdXQoKSBzdWdnZXN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxSaWNoVGV4dFN1Z2dlc3Rpb25SZXN1bHQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncm9vdCcpIHByaXZhdGUgcm9vdFJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YicpIHByaXZhdGUgdGJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnYm9keScpIHByaXZhdGUgYm9keVJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdhc2tFbCcpIHByaXZhdGUgYXNrUmVmPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21lbnVFbCcpIHByaXZhdGUgbWVudVJlZj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdsbmtFbCcpIHByaXZhdGUgbG5rUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3VybEVsJykgcHJpdmF0ZSB1cmxSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW90aW9uID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlbmc6IFJ0ZUVuZ2luZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVtaXR0ZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHF1aWV0ID0gZmFsc2U7XG4gIHByaXZhdGUgcGlja2VkOiBSYW5nZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJ1blRva2VuOiB7IGN0bDogQWJvcnRDb250cm9sbGVyOyBhY3Rpb246IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZG93bj86IChlOiBQb2ludGVyRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVzaXplPzogKCkgPT4gdm9pZDtcblxuICByZWFkb25seSB1aWQgPSAncnRlLScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbiAgbWFjID0gZmFsc2U7XG4gIHRvb2xzID0gVE9PTFMubWFwKHQgPT4gKHsgLi4udCwgb246IGZhbHNlLCBrYmQ6ICcnIH0pKTtcbiAgaXRlbXMgPSB0aGlzLmFpQWN0aW9ucy5tYXAoYSA9PiAoeyAuLi5hLCBvZmY6IGZhbHNlIH0pKTtcbiAgZm9jdXNUYiA9IDA7XG4gIHdvcmRzID0gMDsgZW1wdHkgPSB0cnVlOyBjYW5VbmRvID0gZmFsc2U7IGNhblJlZG8gPSBmYWxzZTsgaGFzSHJlZiA9IGZhbHNlO1xuICBqb2I6IEpvYiB8IG51bGwgPSBudWxsO1xuICBsazogeyBvOiBSYW5nZTI7IGJ0bj86IGJvb2xlYW4gfSB8IG51bGwgPSBudWxsO1xuICB1cmwgPSAnJzsgYmFkID0gZmFsc2U7IGJ1YmJsZSA9IGZhbHNlO1xuICByZXZpZXc6IHsgYWN0aW9uOiBzdHJpbmc7IHJlYWR5OiBib29sZWFuIH0gfCBudWxsID0gbnVsbDtcbiAgc2F5ID0gJyc7XG4gIGFpS2JkID0gJyc7IHVuZG9LYmQgPSAnJzsgcmVkb0tiZCA9ICcnO1xuXG4gIHByaXZhdGUgZ2V0IGJvZHlFbCgpIHsgcmV0dXJuIHRoaXMuYm9keVJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgZ2V0IG1lbnVIZWFkaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuam9iPy5zZWwpIHJldHVybiAnRWRpdCB0aGUgc2VsZWN0aW9uJztcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zb21lKHggPT4gIXgub2ZmICYmICh4LmtpbmQgfHwgJ3N3YXAnKSA9PT0gJ3N3YXAnKSA/ICdFZGl0IHRoaXMgcGFyYWdyYXBoJyA6ICdXcml0ZSB3aXRoIEFJJztcbiAgfVxuICBnZXQgcmV2aWV3TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuYWlBY3Rpb25zLmZpbmQoYSA9PiBhLmtleSA9PT0gdGhpcy5yZXZpZXc/LmFjdGlvbik/LmxhYmVsIHx8ICcnOyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydhaUFjdGlvbnMnXSkgdGhpcy5pdGVtcyA9IHRoaXMuYWlBY3Rpb25zLm1hcChhID0+ICh7IC4uLmEsIG9mZjogZmFsc2UgfSkpO1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddICYmIHRoaXMuZW5nICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLmVtaXR0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmVuZy5yZXZpZXdpbmcoKSkgeyB0aGlzLnJ1blRva2VuPy5jdGwuYWJvcnQoKTsgdGhpcy5ydW5Ub2tlbiA9IG51bGw7IHRoaXMucmV2aWV3ID0gbnVsbDsgfVxuICAgICAgdGhpcy5sb2FkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hYyA9IGlzTWFjKCk7XG4gICAgdGhpcy5haUtiZCA9IGtleXNPZignbW9kIEonLCB0aGlzLm1hYyk7IHRoaXMudW5kb0tiZCA9IGtleXNPZignbW9kIFonLCB0aGlzLm1hYyk7IHRoaXMucmVkb0tiZCA9IGtleXNPZigncmVkbycsIHRoaXMubWFjKTtcbiAgICB0aGlzLnRvb2xzID0gVE9PTFMubWFwKHQgPT4gKHsgLi4udCwgb246IGZhbHNlLCBrYmQ6IGtleXNPZih0LmssIHRoaXMubWFjKSB9KSk7XG4gICAgY29uc3QgRSA9IG5ldyBSdGVFbmdpbmUodGhpcy5ib2R5RWwsIHtcbiAgICAgIGNoYW5nZTogKCkgPT4gdGhpcy5wYWludCgpLFxuICAgICAgc2VsZWN0OiAoKSA9PiB7IHRoaXMucGFpbnQoKTsgdGhpcy5zaG93QnViYmxlKCk7IH0sXG4gICAgICBpbnB1dDogZSA9PiB7IGlmIChlLmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnICYmIGUuZGF0YSA9PT0gJy8nKSB7IGNvbnN0IG8gPSBFLmdldCgpOyBpZiAoby5zID09PSBvLmUgJiYgRS5saW5lKG8ucykucyA9PT0gby5zIC0gMSkgdGhpcy5vcGVuTWVudSgnc2xhc2gnKTsgfSB9LFxuICAgICAga2V5OiBlID0+IHRoaXMuZW5naW5lS2V5KGUpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5nID0gRTtcbiAgICB0aGlzLmxvYWQodGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgICB0aGlzLmRvd24gPSAoZTogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICAgIGlmICh0aGlzLmpvYiAmJiAhdGhpcy5tZW51UmVmPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpICYmICF0aGlzLmFza1JlZj8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSAmJiAhKHQgYXMgRWxlbWVudCkuY2xvc2VzdD8uKCcudm8tcnRlLWFpJykpIHRoaXMuY2xvc2VNZW51KGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmxrICYmICF0aGlzLmxua1JlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpICYmICEodCBhcyBFbGVtZW50KS5jbG9zZXN0Py4oJ1tkYXRhLWY9XCJhXCJdJykpIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTtcbiAgICAgIGlmIChlLmlzVHJ1c3RlZCAmJiAhdGhpcy5hc2tSZWY/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgJiYgIXRoaXMuam9iKSB7IHRoaXMuYnViYmxlID0gZmFsc2U7IGlmICghdGhpcy5yb290UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkpIHRoaXMucGljayhudWxsKTsgfVxuICAgIH07XG4gICAgdGhpcy5yZXNpemUgPSAoKSA9PiB7IHRoaXMuY2xvc2VNZW51KGZhbHNlKTsgdGhpcy5jbG9zZUxpbmsoZmFsc2UpOyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5kb3duKTsgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemUpO1xuICAgIHRoaXMucGFpbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucnVuVG9rZW4/LmN0bC5hYm9ydCgpOyB0aGlzLnJ1blRva2VuID0gbnVsbDsgdGhpcy5waWNrKG51bGwpOyB0aGlzLmVuZz8uZGVzdHJveSgpOyB0aGlzLmVuZyA9IG51bGw7XG4gICAgaWYgKHRoaXMuZG93bikgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLmRvd24pO1xuICAgIGlmICh0aGlzLnJlc2l6ZSkgcmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWR1Y2UoKSB7IHJldHVybiB0aGlzLm1vdGlvbi5yZWR1Y2UoKTsgfVxuICBwcml2YXRlIGFubm91bmNlKHQ6IHN0cmluZykgeyB0aGlzLnNheSA9ICcnOyBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5zYXkgPSB0OyB9LCA2MCk7IH1cblxuICBwcml2YXRlIHBhaW50KCkge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47XG4gICAgY29uc3QgcyA9IEUuc3RhdGUoKTtcbiAgICB0aGlzLnRvb2xzID0gdGhpcy50b29scy5tYXAodCA9PiAoeyAuLi50LCBvbjogdC5mID09PSAnYScgPyBzLkEgOiAvXihoMnx1bHxvbHxxdW90ZSkkLy50ZXN0KHQuZikgPyBzLmJsb2NrID09PSB0LmYgOiAhIShzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pW3QuZi50b1VwcGVyQ2FzZSgpXSB9KSk7XG4gICAgdGhpcy5oYXNIcmVmID0gISFzLmhyZWY7XG4gICAgdGhpcy53b3JkcyA9IEUud29yZHMoKTsgdGhpcy5lbXB0eSA9IEUuZW1wdHkoKTsgdGhpcy5jYW5VbmRvID0gRS5jYW5VbmRvKCk7IHRoaXMuY2FuUmVkbyA9IEUuY2FuUmVkbygpO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLm1hcChhID0+ICh7IC4uLmEsIG9mZjogKGEua2luZCB8fCAnc3dhcCcpID09PSAnc3dhcCcgJiYgISF0aGlzLmpvYiAmJiAhKEUudGV4dCh0aGlzLmpvYi50KS50cmltKCkpIH0pKTtcbiAgICBpZiAoIUUucmV2aWV3aW5nKCkgJiYgIXRoaXMucXVpZXQpIHsgY29uc3QgaHRtbCA9IEUuaHRtbCgpOyBpZiAoaHRtbCAhPT0gdGhpcy5lbWl0dGVkKSB7IHRoaXMuZW1pdHRlZCA9IGh0bWw7IHRoaXMudmFsdWVDaGFuZ2UuZW1pdChodG1sKTsgfSB9XG4gIH1cblxuICBwcml2YXRlIGxvYWQoaHRtbDogc3RyaW5nKSB7IGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47IHRoaXMucXVpZXQgPSB0cnVlOyBFLmxvYWQoaHRtbCk7IHRoaXMucXVpZXQgPSBmYWxzZTsgdGhpcy5lbWl0dGVkID0gRS5odG1sKCk7IHRoaXMucGFpbnQoKTsgfVxuXG4gIC8vIC0tLS0gcGxhY2VtZW50IG9mIHRoZSBwb3BvdmVycyBpbnNpZGUgdGhlIGVkaXRvciAtLS0tXG4gIHByaXZhdGUgcmVjdHNPZihvOiBSYW5nZTIpOiBbRE9NUmVjdCwgRE9NUmVjdF0ge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZyEsIHJzID0gWy4uLkUucmFuZ2UobykuZ2V0Q2xpZW50UmVjdHMoKV0uZmlsdGVyKHggPT4geC53aWR0aCB8fCB4LmhlaWdodCk7XG4gICAgaWYgKHJzLmxlbmd0aCkgcmV0dXJuIFtyc1swXSwgcnNbcnMubGVuZ3RoIC0gMV1dO1xuICAgIGNvbnN0IG4gPSBFLnJhbmdlKEUubGluZShvLnMpKS5zdGFydENvbnRhaW5lciwgZWwgPSAobi5ub2RlVHlwZSA9PT0gMyA/IG4ucGFyZW50RWxlbWVudCA6IG4pIGFzIEVsZW1lbnQsIHJyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtyciwgcnJdO1xuICB9XG4gIHByaXZhdGUgcGxhY2UoZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLCBvOiBSYW5nZTIsIGFib3ZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLnJvb3RSZWY/Lm5hdGl2ZUVsZW1lbnQ7IGlmICghZWwgfHwgIWJveCkgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSBib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHcgPSBlbC5vZmZzZXRXaWR0aCwgaCA9IGVsLm9mZnNldEhlaWdodCwgdG9wID0gKHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgNDQpIC0gMiwgW2YsIGxdID0gdGhpcy5yZWN0c09mKG8pO1xuICAgIGNvbnN0IG92ZXIgPSBmLnRvcCAtIGIudG9wIC0gaCAtIDYsIHVuZGVyID0gbC5ib3R0b20gLSBiLnRvcCArIDY7XG4gICAgY29uc3QgeSA9IGFib3ZlID8gKG92ZXIgPj0gdG9wID8gb3ZlciA6IHVuZGVyKSA6IHVuZGVyICsgaCA8PSBiLmhlaWdodCAtIDQgfHwgb3ZlciA8IHRvcCA/IHVuZGVyIDogb3ZlcjtcbiAgICBlbC5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZChNYXRoLm1heCg2LCBNYXRoLm1pbigoYWJvdmUgPyBmIDogbCkubGVmdCAtIGIubGVmdCAtIChhYm92ZSA/IDAgOiA4KSwgYi53aWR0aCAtIHcgLSA2KSkpICsgJ3B4JztcbiAgICBlbC5zdHlsZS50b3AgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDQsIE1hdGgubWluKHksIGIuaGVpZ2h0IC0gaCAtIDQpKSkgKyAncHgnO1xuICB9XG4gIHByaXZhdGUgcGljayhvOiBSYW5nZTIgfCBudWxsKSB7XG4gICAgY29uc3QgcmVnID0gdHlwZW9mIENTUyAhPT0gJ3VuZGVmaW5lZCcgPyAoQ1NTIGFzIHVua25vd24gYXMgeyBoaWdobGlnaHRzPzogTWFwPHN0cmluZywgU2V0PFJhbmdlPj4gfSkuaGlnaGxpZ2h0cyA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBITCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgSGlnaGxpZ2h0PzogbmV3ICgpID0+IFNldDxSYW5nZT4gfSkuSGlnaGxpZ2h0IDogdW5kZWZpbmVkO1xuICAgIGlmICghcmVnIHx8ICFITCkgcmV0dXJuO1xuICAgIGxldCBoID0gcmVnLmdldCgncnRlLXBpY2snKTsgaWYgKCFoKSB7IGggPSBuZXcgSEwoKTsgcmVnLnNldCgncnRlLXBpY2snLCBoKTsgfVxuICAgIGlmICh0aGlzLnBpY2tlZCkgaC5kZWxldGUodGhpcy5waWNrZWQpO1xuICAgIHRoaXMucGlja2VkID0gbyAmJiBvLnMgIT09IG8uZSAmJiB0aGlzLmVuZyA/IHRoaXMuZW5nLnJhbmdlKG8pIDogbnVsbDtcbiAgICBpZiAodGhpcy5waWNrZWQpIGguYWRkKHRoaXMucGlja2VkKTtcbiAgfVxuICBwcml2YXRlIHNob3dCdWJibGUobz86IFJhbmdlMikge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47XG4gICAgY29uc3QgZyA9IGdldFNlbGVjdGlvbigpLCBzZWwgPSBvIHx8IChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmJvZHlFbCAmJiBnICYmIGcucmFuZ2VDb3VudCAmJiAhZy5pc0NvbGxhcHNlZCA/IEUuZ2V0KCkgOiBudWxsKTtcbiAgICBpZiAoIXNlbCB8fCBFLnJldmlld2luZygpIHx8IHRoaXMuam9iIHx8IHRoaXMubGsgfHwgdGhpcy5haSA9PT0gZmFsc2UgfHwgIUUudGV4dChzZWwpLnRyaW0oKSkgeyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyByZXR1cm47IH1cbiAgICB0aGlzLnBsYWNlKHRoaXMuYXNrUmVmPy5uYXRpdmVFbGVtZW50LCBzZWwsIHRydWUpOyB0aGlzLmJ1YmJsZSA9IHRydWU7XG4gIH1cblxuICAvLyAtLS0tIHRvb2xiYXIgLS0tLVxuICBrZWVwRm9jdXMoZTogTW91c2VFdmVudCkgeyBpZiAoKGUudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoJ2J1dHRvbicpKSBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgcHJpdmF0ZSB0YkJ1dHRvbnMoKSB7IHJldHVybiBbLi4uKHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uOm5vdCg6ZGlzYWJsZWQpJykpXTsgfVxuICB0YktleShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy50YkJ1dHRvbnMoKSwgaSA9IGFsbC5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpOyBpZiAoaSA8IDApIHJldHVybjtcbiAgICBjb25zdCBnbyA9ICh7IEFycm93UmlnaHQ6IGFsbFsoaSArIDEpICUgYWxsLmxlbmd0aF0sIEFycm93TGVmdDogYWxsWyhpIC0gMSArIGFsbC5sZW5ndGgpICUgYWxsLmxlbmd0aF0sIEhvbWU6IGFsbFswXSwgRW5kOiBhbGxbYWxsLmxlbmd0aCAtIDFdIH0gYXMgUmVjb3JkPHN0cmluZywgSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ+KVtlLmtleV07XG4gICAgaWYgKGdvKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28uZm9jdXMoKTsgdGhpcy5mb2N1c1RiID0gdGhpcy50YkJ1dHRvbkluZGV4KGdvKTsgfVxuICB9XG4gIHByaXZhdGUgdGJCdXR0b25JbmRleChiOiBIVE1MQnV0dG9uRWxlbWVudCkgeyByZXR1cm4gWy4uLnRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKV0uaW5kZXhPZihiKTsgfVxuICBhcHBseShmOiBSaWNoVGV4dEZvcm1hdCB8ICdhJywgZTogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFIHx8IEUucmV2aWV3aW5nKCkpIHJldHVybjtcbiAgICBjb25zdCBtaW5lID0gZS5pc1RydXN0ZWQsIGtleSA9IGUuZGV0YWlsID09PSAwO1xuICAgIGlmIChmID09PSAnYScpIHsgaWYgKHRoaXMubGspIHRoaXMuY2xvc2VMaW5rKHRydWUpOyBlbHNlIHRoaXMub3BlbkxpbmsobWluZSwgbWluZSAmJiBrZXkpOyByZXR1cm47IH1cbiAgICBpZiAoZiA9PT0gJ2InIHx8IGYgPT09ICdpJyB8fCBmID09PSAnY29kZScpIEUuaW5saW5lKGYudG9VcHBlckNhc2UoKSk7IGVsc2UgRS5ibG9jayhmKTtcbiAgICBpZiAobWluZSkgRS5mb2N1cygpO1xuICB9XG4gIGRvVW5kbyhlOiBNb3VzZUV2ZW50KSB7IHRoaXMuZW5nPy51bmRvKCk7IGlmIChlLmlzVHJ1c3RlZCkgdGhpcy5lbmc/LmZvY3VzKCk7IH1cbiAgZG9SZWRvKGU6IE1vdXNlRXZlbnQpIHsgdGhpcy5lbmc/LnJlZG8oKTsgaWYgKGUuaXNUcnVzdGVkKSB0aGlzLmVuZz8uZm9jdXMoKTsgfVxuICBvbkFpQnV0dG9uKGU6IE1vdXNlRXZlbnQpIHsgdGhpcy5vcGVuTWVudShlLmlzVHJ1c3RlZCA/IChlLmRldGFpbCA/ICdjbGljaycgOiAnYnV0dG9uJykgOiAnc2NyaXB0Jyk7IH1cbiAgb25Bc2tCdXR0b24oZTogTW91c2VFdmVudCkgeyB0aGlzLm9wZW5NZW51KGUuaXNUcnVzdGVkID8gJ2NsaWNrJyA6ICdzY3JpcHQnKTsgfVxuXG4gIC8vIC0tLS0gdGhlIEFJIG1lbnUgLS0tLVxuICBwcml2YXRlIG1lbnVJdGVtRWxzKCkgeyByZXR1cm4gWy4uLih0aGlzLm1lbnVSZWY/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ1tyb2xlPVwibWVudWl0ZW1cIl0nKSB8fCBbXSldLmZpbHRlcihtID0+IG0uZ2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgIT09ICd0cnVlJyk7IH1cbiAgcHJpdmF0ZSBmb2N1c0l0ZW0obT86IEhUTUxCdXR0b25FbGVtZW50KSB7IGlmICghbSkgcmV0dXJuOyB0aGlzLm1lbnVJdGVtRWxzKCkuZm9yRWFjaCh4ID0+IHsgeC50YWJJbmRleCA9IHggPT09IG0gPyAwIDogLTE7IH0pOyBtLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICBvcGVuTWVudShob3c6ICdrZXknIHwgJ2J1dHRvbicgfCAnY2xpY2snIHwgJ3NsYXNoJyB8ICdzY3JpcHQnKSB7XG4gICAgY29uc3QgRSA9IHRoaXMuZW5nOyBpZiAoIUUgfHwgRS5yZXZpZXdpbmcoKSB8fCB0aGlzLmFpID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTsgRS5mbHVzaCgpO1xuICAgIGlmICh0aGlzLmpvYikgeyB0aGlzLmNsb3NlTWVudShob3cgIT09ICdzY3JpcHQnKTsgcmV0dXJuOyB9XG4gICAgY29uc3QgbyA9IEUuZ2V0KCksIHNsYXNoID0gaG93ID09PSAnc2xhc2gnID8gby5zIC0gMSA6IG51bGwsIHNlbCA9IG8ucyAhPT0gby5lO1xuICAgIGxldCB0ID0gc2VsID8gbyA6IEUubGluZShvLnMpOyBpZiAoc2xhc2ggIT09IG51bGwpIHQgPSB7IHM6IHNsYXNoICsgMSwgZTogdC5lIH07XG4gICAgdGhpcy5qb2IgPSB7IG8sIHQsIHNsYXNoLCBzZWwsIGJ0bjogaG93ID09PSAnYnV0dG9uJyB9O1xuICAgIHRoaXMuYnViYmxlID0gZmFsc2U7IHRoaXMucGljayhzZWwgPyBvIDogbnVsbCk7IHRoaXMucGFpbnQoKTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLnBsYWNlKHRoaXMubWVudVJlZj8ubmF0aXZlRWxlbWVudCwgbyk7IGlmIChob3cgIT09ICdzY3JpcHQnKSB0aGlzLmZvY3VzSXRlbSh0aGlzLm1lbnVJdGVtRWxzKClbMF0pOyB9KTtcbiAgfVxuICBjbG9zZU1lbnUoYmFjazogYm9vbGVhbikge1xuICAgIGNvbnN0IGogPSB0aGlzLmpvYjsgaWYgKCFqKSByZXR1cm47XG4gICAgdGhpcy5qb2IgPSBudWxsOyB0aGlzLnBpY2sobnVsbCk7IHRoaXMucGFpbnQoKTtcbiAgICBpZiAoYmFjayAmJiBqLmJ0bikgeyB0aGlzLmVuZz8uc2V0KGoubyk7IHRoaXMucm9vdFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcudm8tcnRlLWFpJyk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgaWYgKGJhY2spIHRoaXMuZW5nPy5zZXQoai5vLCB0cnVlKTtcbiAgfVxuICBtZW51S2V5KGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm1lbnVJdGVtRWxzKCksIGkgPSBhbGwuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxCdXR0b25FbGVtZW50KTtcbiAgICBjb25zdCBnbyA9ICh7IEFycm93RG93bjogYWxsWyhpICsgMSkgJSBhbGwubGVuZ3RoXSwgQXJyb3dVcDogYWxsWyhpIC0gMSArIGFsbC5sZW5ndGgpICUgYWxsLmxlbmd0aF0sIEhvbWU6IGFsbFswXSwgRW5kOiBhbGxbYWxsLmxlbmd0aCAtIDFdIH0gYXMgUmVjb3JkPHN0cmluZywgSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ+KVtlLmtleV07XG4gICAgaWYgKGdvKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5mb2N1c0l0ZW0oZ28pOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnVGFiJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VNZW51KHRydWUpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkubGVuZ3RoID09PSAxICYmIC9cXFMvLnRlc3QoZS5rZXkpICYmICFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBjb25zdCBrID0gZS5rZXkudG9Mb3dlckNhc2UoKSwgaGl0ID0gWy4uLmFsbC5zbGljZShpICsgMSksIC4uLmFsbC5zbGljZSgwLCBpICsgMSldLmZpbmQobSA9PiAobS50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChrKSk7IGlmIChoaXQpIHRoaXMuZm9jdXNJdGVtKGhpdCk7IH1cbiAgfVxuICBvbk1lbnVJdGVtKGE6IHsga2V5OiBzdHJpbmc7IG9mZjogYm9vbGVhbiB9LCBlOiBNb3VzZUV2ZW50KSB7IGlmICghYS5vZmYpIHRoaXMuYXNrKGEua2V5LCBlLmlzVHJ1c3RlZCk7IH1cblxuICBwcml2YXRlIGhlcmUoRTogUnRlRW5naW5lKTogSm9iIHsgY29uc3QgbyA9IEUuZ2V0KCksIHNlbCA9IG8ucyAhPT0gby5lOyByZXR1cm4geyBvLCB0OiBzZWwgPyBvIDogRS5saW5lKG8ucyksIHNsYXNoOiBudWxsLCBzZWwgfTsgfVxuICBhc2soa2V5OiBzdHJpbmcsIG1pbmU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIGogPSB0aGlzLmpvYiB8fCAoRSAmJiB0aGlzLmhlcmUoRSkpO1xuICAgIGNvbnN0IGFjdCA9IHRoaXMuYWlBY3Rpb25zLmZpbmQoYSA9PiBhLmtleSA9PT0ga2V5KSwgd3JpdGVyID0gdGhpcy5haTtcbiAgICBpZiAoIUUgfHwgIWogfHwgIWFjdCB8fCB3cml0ZXIgPT09IGZhbHNlIHx8IEUucmV2aWV3aW5nKCkpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlTWVudShmYWxzZSk7XG4gICAgbGV0IHQgPSBqLnQsIGVuZCA9IGouby5lO1xuICAgIGlmIChqLnNsYXNoICE9PSBudWxsKSB7IGNvbnN0IHNsID0gai5zbGFzaDsgRS5yZW1vdmUoeyBzOiBzbCwgZTogc2wgKyAxIH0pOyBjb25zdCBiYWNrID0gKHg6IG51bWJlcikgPT4geCA+IHNsID8geCAtIDEgOiB4OyB0ID0geyBzOiBiYWNrKHQucyksIGU6IGJhY2sodC5lKSB9OyBlbmQgPSBiYWNrKGVuZCk7IH1cbiAgICBjb25zdCBraW5kID0gYWN0LmtpbmQgfHwgJ3N3YXAnO1xuICAgIGlmIChraW5kID09PSAnYWRkJykgdCA9IHsgczogZW5kLCBlOiBlbmQgfTtcbiAgICBlbHNlIGlmICghRS50ZXh0KHQpLnRyaW0oKSkgcmV0dXJuO1xuICAgIGNvbnN0IGRvYyA9IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KSwgYmVmb3JlID0gRS50ZXh0KHsgczogMCwgZTogdC5zIH0pLCBhZnRlciA9IEUudGV4dCh7IHM6IHQuZSwgZTogRS50b3RhbCgpIH0pLCBzYWlkID0gRS50ZXh0KHQpO1xuICAgIGNvbnN0IHdyaXRlID0gRS5zdWdnZXN0KHQsIGtpbmQpLCBjdGwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCksIG1lID0geyBjdGwsIGFjdGlvbjoga2V5IH07XG4gICAgdGhpcy5ydW5Ub2tlbiA9IG1lOyBsZXQgZ290ID0gJycsIGZpcnN0ID0gdHJ1ZTtcbiAgICBjb25zdCBwdXQgPSAoczogc3RyaW5nKSA9PiB7IGlmIChmaXJzdCAmJiBraW5kID09PSAnYWRkJyAmJiBiZWZvcmUgJiYgIS9cXHMkLy50ZXN0KGJlZm9yZSkgJiYgIS9eXFxzLy50ZXN0KHMpKSBzID0gJyAnICsgczsgZmlyc3QgPSBmYWxzZTsgZ290ICs9IHM7IHdyaXRlKHMpOyB9O1xuICAgIHRoaXMucmV2aWV3ID0geyBhY3Rpb246IGtleSwgcmVhZHk6IGZhbHNlIH07IHRoaXMuYnViYmxlID0gZmFsc2U7IHRoaXMucGFpbnQoKTtcbiAgICB0aGlzLmFubm91bmNlKGAke2FjdC5sYWJlbH06IHdyaXRpbmcgYSBzdWdnZXN0aW9uYCk7XG4gICAgaWYgKG1pbmUpIEUuZm9jdXMoKTtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gd3JpdGVyKHsgYWN0aW9uOiBrZXksIHRleHQ6IGtpbmQgPT09ICdhZGQnID8gJycgOiBzYWlkLCBiZWZvcmUsIGFmdGVyLCBkb2N1bWVudDogZG9jLCBzaWduYWw6IGN0bC5zaWduYWwgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnc3RyaW5nJyB8fCByZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgY29uc3QgcyA9IGF3YWl0IHJlczsgaWYgKHRoaXMucnVuVG9rZW4gIT09IG1lKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRoaXMucmVkdWNlKCkpIHB1dChzKTtcbiAgICAgICAgICBlbHNlIGZvciAoY29uc3QgdyBvZiBzLm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpIHx8IFtdKSB7IGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuOyBwdXQodyk7IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA0OCkpOyB9XG4gICAgICAgIH0gZWxzZSBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlcykgeyBpZiAodGhpcy5ydW5Ub2tlbiAhPT0gbWUpIHJldHVybjsgcHV0KGNodW5rKTsgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7IGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuOyBjb25zb2xlLmVycm9yKGVycik7IH1cbiAgICAgIGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuO1xuICAgICAgaWYgKCFnb3QudHJpbSgpKSB7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgcmV0dXJuOyB9XG4gICAgICB0aGlzLnJldmlldyA9IHsgYWN0aW9uOiBrZXksIHJlYWR5OiB0cnVlIH07IHRoaXMucGFpbnQoKTtcbiAgICAgIGNvbnN0IHMgPSBnb3QudHJpbSgpOyB0aGlzLmFubm91bmNlKGBTdWdnZXN0aW9uOiAke3N9JHsvWy4hP10kLy50ZXN0KHMpID8gJycgOiAnLid9IFByZXNzIFRhYiBvciBFbnRlciB0byBhY2NlcHQsIG9yIEVzY2FwZSB0byBkaXNjYXJkLmApO1xuICAgIH0pKCk7XG4gIH1cbiAgZmluaXNoKGtlZXA6IGJvb2xlYW4sIG1pbmU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIHIgPSB0aGlzLnJ1blRva2VuOyBpZiAoIUUgfHwgIUUucmV2aWV3aW5nKCkgfHwgIXIpIHJldHVybjtcbiAgICBpZiAoa2VlcCAmJiAhdGhpcy5yZXZpZXc/LnJlYWR5KSByZXR1cm47XG4gICAgY29uc3Qgc2FpZCA9IEUubmV3VGV4dCgpO1xuICAgIHRoaXMucnVuVG9rZW4gPSBudWxsOyByLmN0bC5hYm9ydCgpO1xuICAgIGlmIChrZWVwKSBFLmFjY2VwdCgpOyBlbHNlIEUuZGlzY2FyZCgpO1xuICAgIHRoaXMucmV2aWV3ID0gbnVsbDsgdGhpcy5wYWludCgpOyB0aGlzLmFubm91bmNlKGtlZXAgPyAnU3VnZ2VzdGlvbiBhY2NlcHRlZCcgOiAnU3VnZ2VzdGlvbiBkaXNjYXJkZWQnKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb24uZW1pdCh7IGFjdGlvbjogci5hY3Rpb24sIHRleHQ6IHNhaWQsIGFjY2VwdGVkOiBrZWVwIH0pO1xuICAgIGlmIChtaW5lKSBFLmZvY3VzKCk7XG4gIH1cblxuICAvLyAtLS0tIHRoZSBsaW5rIGZpZWxkIC0tLS1cbiAgb3BlbkxpbmsobWluZTogYm9vbGVhbiwgYnRuID0gZmFsc2UpIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmc7IGlmICghRSB8fCBFLnJldmlld2luZygpKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZU1lbnUoZmFsc2UpOyBFLmZsdXNoKCk7XG4gICAgY29uc3QgbyA9IEUuZ2V0KCksIHMgPSBFLnN0YXRlKCk7XG4gICAgdGhpcy5sayA9IHsgbywgYnRuIH07IHRoaXMudXJsID0gcy5ocmVmIHx8ICcnOyB0aGlzLmJhZCA9IGZhbHNlOyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyB0aGlzLmhhc0hyZWYgPSAhIXMuaHJlZjsgdGhpcy5waWNrKG8pO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRoaXMucGxhY2UodGhpcy5sbmtSZWYubmF0aXZlRWxlbWVudCwgbyk7IGlmIChtaW5lKSB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfSk7XG4gIH1cbiAgY2xvc2VMaW5rKGJhY2s6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBqID0gdGhpcy5sazsgaWYgKCFqKSByZXR1cm47XG4gICAgdGhpcy5sayA9IG51bGw7IHRoaXMucGljayhudWxsKTtcbiAgICBpZiAoYmFjayAmJiBqLmJ0bikgeyB0aGlzLmVuZz8uc2V0KGoubyk7IHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZj1cImFcIl0nKT8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9XG4gICAgZWxzZSBpZiAoYmFjaykgdGhpcy5lbmc/LnNldChqLm8sIHRydWUpO1xuICB9XG4gIHByaXZhdGUgdG9Vcmwodjogc3RyaW5nKSB7IHYgPSB2LnRyaW0oKTsgaWYgKCF2KSByZXR1cm4gbnVsbDsgaWYgKC9eKGh0dHBzPzpcXC9cXC98bWFpbHRvOikvaS50ZXN0KHYpKSByZXR1cm4gdjsgaWYgKC9eW15cXHNAL10rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHYpKSByZXR1cm4gJ21haWx0bzonICsgdjsgaWYgKC9eW1xcdy1dKyhcXC5bXFx3LV0rKSsoOlxcZCspPyhbLz8jXVxcUyopPyQvLnRlc3QodikpIHJldHVybiAnaHR0cHM6Ly8nICsgdjsgcmV0dXJuIG51bGw7IH1cbiAgYXBwbHlMaW5rKGhyZWY6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIGogPSB0aGlzLmxrOyBpZiAoIUUgfHwgIWopIHJldHVybjtcbiAgICBpZiAoaHJlZiA9PT0gJycpIHsgY29uc3QgaCA9IHRoaXMudG9VcmwodGhpcy51cmwpOyBpZiAoIWgpIHsgdGhpcy5iYWQgPSB0cnVlOyB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgcmV0dXJuOyB9IGhyZWYgPSBoOyB9XG4gICAgdGhpcy5jbG9zZUxpbmsoZmFsc2UpOyBFLnNldChqLm8pOyBFLmxpbmsoai5vLCBocmVmKTsgRS5mb2N1cygpO1xuICB9XG4gIG9uVXJsSW5wdXQoZTogRXZlbnQpIHsgdGhpcy51cmwgPSAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7IHRoaXMuYmFkID0gZmFsc2U7IH1cbiAgbG5rS2V5KGU6IEtleWJvYXJkRXZlbnQpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIGUudGFyZ2V0ID09PSB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50KSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5hcHBseUxpbmsoJycpOyB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VMaW5rKHRydWUpOyB9IH1cbiAgbG5rQmx1cihlOiBGb2N1c0V2ZW50KSB7IGlmICh0aGlzLmxrICYmIGUucmVsYXRlZFRhcmdldCAmJiAhdGhpcy5sbmtSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTsgfVxuXG4gIC8vIC0tLS0gcm9vdC1sZXZlbCBrZXlzIC0tLS1cbiAgcHJpdmF0ZSBlbmdpbmVLZXkoZTogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZyE7XG4gICAgaWYgKEUucmV2aWV3aW5nKCkpIHtcbiAgICAgIGlmICgoZS5rZXkgPT09ICdUYWInIHx8IGUua2V5ID09PSAnRW50ZXInKSAmJiAhZS5zaGlmdEtleSAmJiAhZS5hbHRLZXkgJiYgIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5maW5pc2godHJ1ZSwgdHJ1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8ICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3onKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbW9kID0gaXNNYWMoKSA/IGUubWV0YUtleSAmJiAhZS5jdHJsS2V5IDogZS5jdHJsS2V5ICYmICFlLm1ldGFLZXksIGsgPSBlLmtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChtb2QgJiYgIWUuYWx0S2V5ICYmICFlLnNoaWZ0S2V5ICYmIChrID09PSAnaycgfHwgKGsgPT09ICdqJyAmJiB0aGlzLmFpICE9PSBmYWxzZSkpKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKGsgPT09ICdrJykgdGhpcy5vcGVuTGluayh0cnVlKTsgZWxzZSB0aGlzLm9wZW5NZW51KCdrZXknKTsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7IHRoaXMuYnViYmxlID0gZmFsc2U7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvblJvb3RLZXkoZTogS2V5Ym9hcmRFdmVudCkgeyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMucmV2aWV3ICYmICF0aGlzLmJvZHlFbC5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgfSB9XG4gIG9uUm9vdFBvaW50ZXJEb3duKGU6IFBvaW50ZXJFdmVudCkgeyBpZiAoZS5pc1RydXN0ZWQgJiYgIXRoaXMuam9iKSB0aGlzLnBpY2sobnVsbCk7IH1cblxuICAvLyAtLS0tIGltcGVyYXRpdmUgaGFuZGxlLCBmb3Igc2NyaXB0ZWQgZGVtb3MgLS0tLVxuICBmb2N1cygpIHsgdGhpcy5lbmc/LmZvY3VzKCk7IH1cbiAgZ2V0SFRNTCgpIHsgcmV0dXJuIHRoaXMuZW5nPy5odG1sKCkgfHwgJyc7IH1cbiAgZ2V0VGV4dCgpIHsgY29uc3QgRSA9IHRoaXMuZW5nOyByZXR1cm4gRSA/IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KSA6ICcnOyB9XG4gIHNldEhUTUwoaHRtbDogc3RyaW5nKSB7IHRoaXMubG9hZChodG1sKTsgfVxuICBzZWxlY3Qoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgRSA9IHRoaXMuZW5nOyBpZiAoIUUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhdCA9IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KS5pbmRleE9mKHMpOyBpZiAoYXQgPCAwIHx8ICFzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbyA9IHsgczogYXQsIGU6IGF0ICsgcy5sZW5ndGggfTsgRS5zZXQobyk7IEUuc2hvdyhvKTsgdGhpcy5waWNrKG8pOyB0aGlzLnNob3dCdWJibGUobyk7IHRoaXMucGFpbnQoKTsgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHlwZVRleHQoczogc3RyaW5nKSB7IHRoaXMuZW5nPy50eXBlKHMpOyB9XG4gIG5ld0xpbmUoKSB7IHRoaXMuZW5nPy5zcGxpdCgpOyB9XG4gIGZvcm1hdChmOiBSaWNoVGV4dEZvcm1hdCkgeyBjb25zdCBFID0gdGhpcy5lbmc7IGlmICghRSB8fCBFLnJldmlld2luZygpKSByZXR1cm47IGlmIChmID09PSAnYicgfHwgZiA9PT0gJ2knIHx8IGYgPT09ICdjb2RlJykgRS5pbmxpbmUoZi50b1VwcGVyQ2FzZSgpKTsgZWxzZSBFLmJsb2NrKGYpOyB9XG4gIG9wZW5BaSgpIHsgdGhpcy5vcGVuTWVudSgnc2NyaXB0Jyk7IH1cbiAgYXNrQWkoYTogc3RyaW5nKSB7IHRoaXMuYXNrKGEsIGZhbHNlKTsgfVxuICBhY2NlcHQoKSB7IHRoaXMuZmluaXNoKHRydWUsIGZhbHNlKTsgfVxuICBkaXNjYXJkKCkgeyB0aGlzLmZpbmlzaChmYWxzZSwgZmFsc2UpOyB9XG4gIHVuZG8oKSB7IHRoaXMuZW5nPy51bmRvKCk7IH1cbiAgcmVkbygpIHsgdGhpcy5lbmc/LnJlZG8oKTsgfVxufVxuIl19
|