@algoux/standard-ranklist-renderer-component-angular 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +3 -1
  2. package/dist/README.md +150 -0
  3. package/dist/esm2022/algoux-standard-ranklist-renderer-component-angular.mjs +5 -0
  4. package/dist/esm2022/lib/index.mjs +8 -0
  5. package/dist/esm2022/lib/modal/default-solution-modal.component.mjs +146 -0
  6. package/dist/esm2022/lib/modal/default-user-modal.component.mjs +172 -0
  7. package/dist/esm2022/lib/modal/modal-interactions.mjs +2 -0
  8. package/dist/esm2022/lib/modal/modal.component.mjs +263 -0
  9. package/dist/esm2022/lib/progress/progress-bar.component.mjs +247 -0
  10. package/dist/esm2022/lib/progress/progress-utils.mjs +45 -0
  11. package/dist/esm2022/lib/ranklist/ranklist-utils.mjs +110 -0
  12. package/dist/esm2022/lib/ranklist/ranklist.component.mjs +1010 -0
  13. package/dist/esm2022/lib/ranklist/status-cell-template.directive.mjs +18 -0
  14. package/dist/esm2022/lib/ranklist/user-cell-template.directive.mjs +18 -0
  15. package/dist/esm2022/lib/types.mjs +2 -0
  16. package/dist/esm2022/public-api.mjs +2 -0
  17. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs +2002 -0
  18. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs.map +1 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/lib/index.d.ts +8 -0
  21. package/dist/lib/modal/default-solution-modal.component.d.ts +30 -0
  22. package/dist/lib/modal/default-user-modal.component.d.ts +34 -0
  23. package/dist/lib/modal/modal-interactions.d.ts +1 -0
  24. package/dist/lib/modal/modal.component.d.ts +49 -0
  25. package/dist/lib/progress/progress-bar.component.d.ts +31 -0
  26. package/dist/lib/progress/progress-utils.d.ts +15 -0
  27. package/dist/lib/ranklist/ranklist-utils.d.ts +22 -0
  28. package/dist/lib/ranklist/ranklist.component.d.ts +87 -0
  29. package/dist/lib/ranklist/status-cell-template.directive.d.ts +26 -0
  30. package/dist/lib/ranklist/user-cell-template.directive.d.ts +22 -0
  31. package/dist/lib/types.d.ts +29 -0
  32. package/dist/public-api.d.ts +1 -0
  33. package/package.json +3 -3
@@ -0,0 +1,110 @@
1
+ import { EnumTheme, formatTimeDuration, numberToAlphabet, resolveStyle, resolveText, secToTimeStr, } from '@algoux/standard-ranklist-utils';
2
+ export { caniuse, srkSupportedVersions } from '@algoux/standard-ranklist-renderer-component-core';
3
+ export const defaultBackgroundColor = {
4
+ [EnumTheme.light]: '#ffffff',
5
+ [EnumTheme.dark]: '#191919',
6
+ };
7
+ export function resolveSrkAssetUrl(url, field, formatter) {
8
+ if (typeof formatter === 'function') {
9
+ return formatter(url, field);
10
+ }
11
+ if (url.startsWith('//')) {
12
+ return url;
13
+ }
14
+ const protocolMatch = url.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);
15
+ if (protocolMatch) {
16
+ const protocol = protocolMatch[1].toLowerCase();
17
+ if (protocol === 'http' || protocol === 'https' || protocol === 'data') {
18
+ return url;
19
+ }
20
+ console.warn(`unsupported protocol "${protocol}" in srk asset url:`, url);
21
+ return '';
22
+ }
23
+ console.warn('unsupported srk asset url:', url);
24
+ return '';
25
+ }
26
+ export function getAcceptedStatusDetails(status) {
27
+ return `${status.tries}/${status.time ? formatTimeDuration(status.time, 'min', Math.floor) : '-'}`;
28
+ }
29
+ export function getSolutionResultMeta(result) {
30
+ switch (result) {
31
+ case 'FB':
32
+ return { label: 'First Blood', className: 'srk-preset-result-fb' };
33
+ case 'AC':
34
+ return { label: 'Accepted', className: 'srk-preset-result-ac' };
35
+ case 'RJ':
36
+ return { label: 'Rejected', className: 'srk-preset-result-rj' };
37
+ case '?':
38
+ return { label: 'Frozen', className: 'srk-preset-result-fz' };
39
+ case 'WA':
40
+ return { label: 'Wrong Answer', className: 'srk-preset-result-rj' };
41
+ case 'PE':
42
+ return { label: 'Presentation Error', className: 'srk-preset-result-rj' };
43
+ case 'TLE':
44
+ return { label: 'Time Limit Exceeded', className: 'srk-preset-result-rj' };
45
+ case 'MLE':
46
+ return { label: 'Memory Limit Exceeded', className: 'srk-preset-result-rj' };
47
+ case 'OLE':
48
+ return { label: 'Output Limit Exceeded', className: 'srk-preset-result-rj' };
49
+ case 'RTE':
50
+ return { label: 'Runtime Error', className: 'srk-preset-result-rj' };
51
+ case 'NOUT':
52
+ return { label: 'No Output' };
53
+ case 'CE':
54
+ return { label: 'Compile Error' };
55
+ case 'UKE':
56
+ return { label: 'Unknown Error' };
57
+ case null:
58
+ return { label: '--' };
59
+ default:
60
+ return { label: result };
61
+ }
62
+ }
63
+ export function getSolutionModalTitle(problemIndex, user) {
64
+ return `Solutions of ${numberToAlphabet(problemIndex)} (${resolveText(user.name)})`;
65
+ }
66
+ export function formatSolutionTimestamp(solution) {
67
+ return secToTimeStr(formatTimeDuration(solution.time, 's'));
68
+ }
69
+ export function getProblemHeaderBackgroundImage(style, theme) {
70
+ const { backgroundColor } = resolveStyle(style || {});
71
+ const resolvedColor = backgroundColor[theme] || defaultBackgroundColor[theme];
72
+ const bgColorAlphaStr = withAlpha(resolvedColor, 0.27);
73
+ return `linear-gradient(180deg, ${resolvedColor} 0%, ${resolvedColor} 10%, ${bgColorAlphaStr} 10%, transparent 100%)`;
74
+ }
75
+ export function getMarkerPresentation(marker, theme) {
76
+ if (typeof marker.style === 'string') {
77
+ return { className: `srk-preset-marker-${marker.style}` };
78
+ }
79
+ if (marker.style) {
80
+ return {
81
+ style: {
82
+ backgroundColor: resolveStyle(marker.style).backgroundColor[theme],
83
+ },
84
+ };
85
+ }
86
+ return {};
87
+ }
88
+ export function shouldShowTimeColumn(rows) {
89
+ return rows.some((row) => Boolean(row.score?.time));
90
+ }
91
+ function withAlpha(color, alpha) {
92
+ const hexMatch = color.match(/^#([0-9a-f]{6})$/i);
93
+ if (hexMatch) {
94
+ const value = hexMatch[1];
95
+ const red = parseInt(value.slice(0, 2), 16);
96
+ const green = parseInt(value.slice(2, 4), 16);
97
+ const blue = parseInt(value.slice(4, 6), 16);
98
+ return `rgba(${red}, ${green}, ${blue}, ${alpha})`;
99
+ }
100
+ const rgbMatch = color.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);
101
+ if (rgbMatch) {
102
+ return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${alpha})`;
103
+ }
104
+ const rgbaMatch = color.match(/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*[\d.]+\s*\)$/i);
105
+ if (rgbaMatch) {
106
+ return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${alpha})`;
107
+ }
108
+ return color;
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFua2xpc3QtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhbmtsaXN0L3JhbmtsaXN0LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUVsRyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBOEI7SUFDL0QsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUztJQUM1QixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTO0NBQzVCLENBQUM7QUFjRixNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLEdBQVcsRUFDWCxLQUFhLEVBQ2IsU0FBa0Q7SUFFbEQsSUFBSSxPQUFPLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxPQUFPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUMvRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdkUsT0FBTyxHQUFHLENBQUM7UUFDYixD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QUUsQ0FBQztRQUNiLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLFFBQVEsR0FBRyxLQUFLLEtBQUssS0FBSyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUM5RSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxRQUFRLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDO0lBQzFFLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDN0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sUUFBUSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQztJQUM3RSxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBzcmsgZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdCc7XG5pbXBvcnQge1xuICBFbnVtVGhlbWUsXG4gIGZvcm1hdFRpbWVEdXJhdGlvbixcbiAgbnVtYmVyVG9BbHBoYWJldCxcbiAgcmVzb2x2ZVN0eWxlLFxuICByZXNvbHZlVGV4dCxcbiAgc2VjVG9UaW1lU3RyLFxufSBmcm9tICdAYWxnb3V4L3N0YW5kYXJkLXJhbmtsaXN0LXV0aWxzJztcbmV4cG9ydCB7IGNhbml1c2UsIHNya1N1cHBvcnRlZFZlcnNpb25zIH0gZnJvbSAnQGFsZ291eC9zdGFuZGFyZC1yYW5rbGlzdC1yZW5kZXJlci1jb21wb25lbnQtY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QmFja2dyb3VuZENvbG9yOiBSZWNvcmQ8RW51bVRoZW1lLCBzdHJpbmc+ID0ge1xuICBbRW51bVRoZW1lLmxpZ2h0XTogJyNmZmZmZmYnLFxuICBbRW51bVRoZW1lLmRhcmtdOiAnIzE5MTkxOScsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtlclByZXNlbnRhdGlvbiB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgc3R5bGU/OiB7XG4gICAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbHV0aW9uUmVzdWx0TWV0YSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTcmtBc3NldFVybChcbiAgdXJsOiBzdHJpbmcsXG4gIGZpZWxkOiBzdHJpbmcsXG4gIGZvcm1hdHRlcj86ICh1cmw6IHN0cmluZywgZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZm9ybWF0dGVyKHVybCwgZmllbGQpO1xuICB9XG4gIGlmICh1cmwuc3RhcnRzV2l0aCgnLy8nKSkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgY29uc3QgcHJvdG9jb2xNYXRjaCA9IHVybC5tYXRjaCgvXihbYS16QS1aXVthLXpBLVowLTkrLi1dKik6Lyk7XG4gIGlmIChwcm90b2NvbE1hdGNoKSB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBwcm90b2NvbE1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHByb3RvY29sID09PSAnaHR0cCcgfHwgcHJvdG9jb2wgPT09ICdodHRwcycgfHwgcHJvdG9jb2wgPT09ICdkYXRhJykge1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGB1bnN1cHBvcnRlZCBwcm90b2NvbCBcIiR7cHJvdG9jb2x9XCIgaW4gc3JrIGFzc2V0IHVybDpgLCB1cmwpO1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zb2xlLndhcm4oJ3Vuc3VwcG9ydGVkIHNyayBhc3NldCB1cmw6JywgdXJsKTtcbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXB0ZWRTdGF0dXNEZXRhaWxzKHN0YXR1czogc3JrLlJhbmtQcm9ibGVtU3RhdHVzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0YXR1cy50cmllc30vJHtzdGF0dXMudGltZSA/IGZvcm1hdFRpbWVEdXJhdGlvbihzdGF0dXMudGltZSwgJ21pbicsIE1hdGguZmxvb3IpIDogJy0nfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb2x1dGlvblJlc3VsdE1ldGEocmVzdWx0OiBzcmsuU29sdXRpb25bJ3Jlc3VsdCddKTogU29sdXRpb25SZXN1bHRNZXRhIHtcbiAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICBjYXNlICdGQic6XG4gICAgICByZXR1cm4geyBsYWJlbDogJ0ZpcnN0IEJsb29kJywgY2xhc3NOYW1lOiAnc3JrLXByZXNldC1yZXN1bHQtZmInIH07XG4gICAgY2FzZSAnQUMnOlxuICAgICAgcmV0dXJuIHsgbGFiZWw6ICdBY2NlcHRlZCcsIGNsYXNzTmFtZTogJ3Nyay1wcmVzZXQtcmVzdWx0LWFjJyB9O1xuICAgIGNhc2UgJ1JKJzpcbiAgICAgIHJldHVybiB7IGxhYmVsOiAnUmVqZWN0ZWQnLCBjbGFzc05hbWU6ICdzcmstcHJlc2V0LXJlc3VsdC1yaicgfTtcbiAgICBjYXNlICc/JzpcbiAgICAgIHJldHVybiB7IGxhYmVsOiAnRnJvemVuJywgY2xhc3NOYW1lOiAnc3JrLXByZXNldC1yZXN1bHQtZnonIH07XG4gICAgY2FzZSAnV0EnOlxuICAgICAgcmV0dXJuIHsgbGFiZWw6ICdXcm9uZyBBbnN3ZXInLCBjbGFzc05hbWU6ICdzcmstcHJlc2V0LXJlc3VsdC1yaicgfTtcbiAgICBjYXNlICdQRSc6XG4gICAgICByZXR1cm4geyBsYWJlbDogJ1ByZXNlbnRhdGlvbiBFcnJvcicsIGNsYXNzTmFtZTogJ3Nyay1wcmVzZXQtcmVzdWx0LXJqJyB9O1xuICAgIGNhc2UgJ1RMRSc6XG4gICAgICByZXR1cm4geyBsYWJlbDogJ1RpbWUgTGltaXQgRXhjZWVkZWQnLCBjbGFzc05hbWU6ICdzcmstcHJlc2V0LXJlc3VsdC1yaicgfTtcbiAgICBjYXNlICdNTEUnOlxuICAgICAgcmV0dXJuIHsgbGFiZWw6ICdNZW1vcnkgTGltaXQgRXhjZWVkZWQnLCBjbGFzc05hbWU6ICdzcmstcHJlc2V0LXJlc3VsdC1yaicgfTtcbiAgICBjYXNlICdPTEUnOlxuICAgICAgcmV0dXJuIHsgbGFiZWw6ICdPdXRwdXQgTGltaXQgRXhjZWVkZWQnLCBjbGFzc05hbWU6ICdzcmstcHJlc2V0LXJlc3VsdC1yaicgfTtcbiAgICBjYXNlICdSVEUnOlxuICAgICAgcmV0dXJuIHsgbGFiZWw6ICdSdW50aW1lIEVycm9yJywgY2xhc3NOYW1lOiAnc3JrLXByZXNldC1yZXN1bHQtcmonIH07XG4gICAgY2FzZSAnTk9VVCc6XG4gICAgICByZXR1cm4geyBsYWJlbDogJ05vIE91dHB1dCcgfTtcbiAgICBjYXNlICdDRSc6XG4gICAgICByZXR1cm4geyBsYWJlbDogJ0NvbXBpbGUgRXJyb3InIH07XG4gICAgY2FzZSAnVUtFJzpcbiAgICAgIHJldHVybiB7IGxhYmVsOiAnVW5rbm93biBFcnJvcicgfTtcbiAgICBjYXNlIG51bGw6XG4gICAgICByZXR1cm4geyBsYWJlbDogJy0tJyB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBsYWJlbDogcmVzdWx0IH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbHV0aW9uTW9kYWxUaXRsZShwcm9ibGVtSW5kZXg6IG51bWJlciwgdXNlcjogc3JrLlVzZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYFNvbHV0aW9ucyBvZiAke251bWJlclRvQWxwaGFiZXQocHJvYmxlbUluZGV4KX0gKCR7cmVzb2x2ZVRleHQodXNlci5uYW1lKX0pYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNvbHV0aW9uVGltZXN0YW1wKHNvbHV0aW9uOiBzcmsuU29sdXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjVG9UaW1lU3RyKGZvcm1hdFRpbWVEdXJhdGlvbihzb2x1dGlvbi50aW1lLCAncycpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2JsZW1IZWFkZXJCYWNrZ3JvdW5kSW1hZ2Uoc3R5bGU6IHNyay5TdHlsZSB8IHVuZGVmaW5lZCwgdGhlbWU6IEVudW1UaGVtZSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYmFja2dyb3VuZENvbG9yIH0gPSByZXNvbHZlU3R5bGUoc3R5bGUgfHwge30pO1xuICBjb25zdCByZXNvbHZlZENvbG9yID0gYmFja2dyb3VuZENvbG9yW3RoZW1lXSB8fCBkZWZhdWx0QmFja2dyb3VuZENvbG9yW3RoZW1lXTtcbiAgY29uc3QgYmdDb2xvckFscGhhU3RyID0gd2l0aEFscGhhKHJlc29sdmVkQ29sb3IsIDAuMjcpO1xuICByZXR1cm4gYGxpbmVhci1ncmFkaWVudCgxODBkZWcsICR7cmVzb2x2ZWRDb2xvcn0gMCUsICR7cmVzb2x2ZWRDb2xvcn0gMTAlLCAke2JnQ29sb3JBbHBoYVN0cn0gMTAlLCB0cmFuc3BhcmVudCAxMDAlKWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrZXJQcmVzZW50YXRpb24obWFya2VyOiBzcmsuTWFya2VyLCB0aGVtZTogRW51bVRoZW1lKTogTWFya2VyUHJlc2VudGF0aW9uIHtcbiAgaWYgKHR5cGVvZiBtYXJrZXIuc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lOiBgc3JrLXByZXNldC1tYXJrZXItJHttYXJrZXIuc3R5bGV9YCB9O1xuICB9XG4gIGlmIChtYXJrZXIuc3R5bGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiByZXNvbHZlU3R5bGUobWFya2VyLnN0eWxlKS5iYWNrZ3JvdW5kQ29sb3JbdGhlbWVdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNob3dUaW1lQ29sdW1uKHJvd3M6IHNyay5SYW5rbGlzdFJvd1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiByb3dzLnNvbWUoKHJvdykgPT4gQm9vbGVhbihyb3cuc2NvcmU/LnRpbWUpKTtcbn1cblxuZnVuY3Rpb24gd2l0aEFscGhhKGNvbG9yOiBzdHJpbmcsIGFscGhhOiBudW1iZXIpIHtcbiAgY29uc3QgaGV4TWF0Y2ggPSBjb2xvci5tYXRjaCgvXiMoWzAtOWEtZl17Nn0pJC9pKTtcbiAgaWYgKGhleE1hdGNoKSB7XG4gICAgY29uc3QgdmFsdWUgPSBoZXhNYXRjaFsxXTtcbiAgICBjb25zdCByZWQgPSBwYXJzZUludCh2YWx1ZS5zbGljZSgwLCAyKSwgMTYpO1xuICAgIGNvbnN0IGdyZWVuID0gcGFyc2VJbnQodmFsdWUuc2xpY2UoMiwgNCksIDE2KTtcbiAgICBjb25zdCBibHVlID0gcGFyc2VJbnQodmFsdWUuc2xpY2UoNCwgNiksIDE2KTtcbiAgICByZXR1cm4gYHJnYmEoJHtyZWR9LCAke2dyZWVufSwgJHtibHVlfSwgJHthbHBoYX0pYDtcbiAgfVxuXG4gIGNvbnN0IHJnYk1hdGNoID0gY29sb3IubWF0Y2goL15yZ2JcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKSQvaSk7XG4gIGlmIChyZ2JNYXRjaCkge1xuICAgIHJldHVybiBgcmdiYSgke3JnYk1hdGNoWzFdfSwgJHtyZ2JNYXRjaFsyXX0sICR7cmdiTWF0Y2hbM119LCAke2FscGhhfSlgO1xuICB9XG5cbiAgY29uc3QgcmdiYU1hdGNoID0gY29sb3IubWF0Y2goL15yZ2JhXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKltcXGQuXStcXHMqXFwpJC9pKTtcbiAgaWYgKHJnYmFNYXRjaCkge1xuICAgIHJldHVybiBgcmdiYSgke3JnYmFNYXRjaFsxXX0sICR7cmdiYU1hdGNoWzJdfSwgJHtyZ2JhTWF0Y2hbM119LCAke2FscGhhfSlgO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuIl19