@algoux/standard-ranklist-renderer-component-angular 0.5.0 → 0.6.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.
Files changed (33) hide show
  1. package/README.md +48 -0
  2. package/package.json +9 -3
  3. package/dist/README.md +0 -100
  4. package/dist/esm2022/algoux-standard-ranklist-renderer-component-angular.mjs +0 -5
  5. package/dist/esm2022/lib/index.mjs +0 -8
  6. package/dist/esm2022/lib/modal/default-solution-modal.component.mjs +0 -146
  7. package/dist/esm2022/lib/modal/default-user-modal.component.mjs +0 -172
  8. package/dist/esm2022/lib/modal/modal-interactions.mjs +0 -2
  9. package/dist/esm2022/lib/modal/modal.component.mjs +0 -263
  10. package/dist/esm2022/lib/progress/progress-bar.component.mjs +0 -247
  11. package/dist/esm2022/lib/progress/progress-utils.mjs +0 -45
  12. package/dist/esm2022/lib/ranklist/ranklist-utils.mjs +0 -110
  13. package/dist/esm2022/lib/ranklist/ranklist.component.mjs +0 -593
  14. package/dist/esm2022/lib/ranklist/status-cell-template.directive.mjs +0 -18
  15. package/dist/esm2022/lib/ranklist/user-cell-template.directive.mjs +0 -18
  16. package/dist/esm2022/lib/types.mjs +0 -2
  17. package/dist/esm2022/public-api.mjs +0 -2
  18. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs +0 -1585
  19. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs.map +0 -1
  20. package/dist/index.d.ts +0 -5
  21. package/dist/lib/index.d.ts +0 -8
  22. package/dist/lib/modal/default-solution-modal.component.d.ts +0 -30
  23. package/dist/lib/modal/default-user-modal.component.d.ts +0 -34
  24. package/dist/lib/modal/modal-interactions.d.ts +0 -1
  25. package/dist/lib/modal/modal.component.d.ts +0 -49
  26. package/dist/lib/progress/progress-bar.component.d.ts +0 -31
  27. package/dist/lib/progress/progress-utils.d.ts +0 -15
  28. package/dist/lib/ranklist/ranklist-utils.d.ts +0 -22
  29. package/dist/lib/ranklist/ranklist.component.d.ts +0 -57
  30. package/dist/lib/ranklist/status-cell-template.directive.d.ts +0 -23
  31. package/dist/lib/ranklist/user-cell-template.directive.d.ts +0 -20
  32. package/dist/lib/types.d.ts +0 -27
  33. package/dist/public-api.d.ts +0 -1
@@ -1,110 +0,0 @@
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