@pagerduty/backstage-plugin 0.12.1-next.56 → 0.12.1-next.57
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/dist/esm/{index-a775a548.esm.js → index-2a806dc4.esm.js} +2 -2
- package/dist/esm/{index-a775a548.esm.js.map → index-2a806dc4.esm.js.map} +1 -1
- package/dist/esm/index-52835eae.esm.js +155 -0
- package/dist/esm/index-52835eae.esm.js.map +1 -0
- package/dist/esm/{index-c49d6ec3.esm.js → index-734a65f6.esm.js} +3 -3
- package/dist/esm/{index-c49d6ec3.esm.js.map → index-734a65f6.esm.js.map} +1 -1
- package/dist/index.esm.js +1 -1
- package/package.json +8 -1
- package/dist/esm/index-e3fee98b.esm.js +0 -186
- package/dist/esm/index-e3fee98b.esm.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { E as EntityPagerDutyCard, c as EntityPagerDutySmallCard, H as HomePagePagerDutyCard, f as PagerDutyCard, e as PagerDutyClient, b as PagerDutyPage, T as TriggerButton, U as UnauthorizedError, i as isPagerDutyAvailable, d as isPagerDutySmallCardAvailable, i as isPluginApplicableToEntity, p as pagerDutyApiRef, a as pagerDutyPlugin, a as plugin } from './esm/index-
|
|
1
|
+
export { E as EntityPagerDutyCard, c as EntityPagerDutySmallCard, H as HomePagePagerDutyCard, f as PagerDutyCard, e as PagerDutyClient, b as PagerDutyPage, T as TriggerButton, U as UnauthorizedError, i as isPagerDutyAvailable, d as isPagerDutySmallCardAvailable, i as isPluginApplicableToEntity, p as pagerDutyApiRef, a as pagerDutyPlugin, a as plugin } from './esm/index-734a65f6.esm.js';
|
|
2
2
|
import '@backstage/core-plugin-api';
|
|
3
3
|
import '@backstage/errors';
|
|
4
4
|
import '@backstage/plugin-home-react';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin",
|
|
3
3
|
"description": "A Backstage plugin that integrates towards PagerDuty",
|
|
4
|
-
"version": "0.12.1-next.
|
|
4
|
+
"version": "0.12.1-next.57",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -41,12 +41,19 @@
|
|
|
41
41
|
"@backstage/plugin-catalog-react": "^1.9.1",
|
|
42
42
|
"@backstage/plugin-home-react": "^0.1.5",
|
|
43
43
|
"@backstage/theme": "^0.5.2",
|
|
44
|
+
"@emotion/react": "^11.11.4",
|
|
45
|
+
"@emotion/styled": "^11.11.5",
|
|
44
46
|
"@material-ui/core": "^4.12.2",
|
|
45
47
|
"@material-ui/icons": "^4.9.1",
|
|
46
48
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
49
|
+
"@mui/icons-material": "^5.15.19",
|
|
50
|
+
"@mui/material": "^5.15.19",
|
|
51
|
+
"@mui/x-date-pickers": "^7.6.1",
|
|
47
52
|
"@pagerduty/backstage-plugin-common": "^0.1.5-next.7",
|
|
53
|
+
"@tanstack/react-query": "^5.40.1",
|
|
48
54
|
"classnames": "^2.2.6",
|
|
49
55
|
"luxon": "^3.4.1",
|
|
56
|
+
"material-react-table": "^2.13.0",
|
|
50
57
|
"react-use": "^17.2.4",
|
|
51
58
|
"validate-color": "^2.2.4"
|
|
52
59
|
},
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { Typography, FormControl, Select, MenuItem, Button, Grid } from '@material-ui/core';
|
|
3
|
-
import { Table, Page, Header, Content } from '@backstage/core-components';
|
|
4
|
-
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
-
import { p as pagerDutyApiRef } from './index-c49d6ec3.esm.js';
|
|
6
|
-
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
7
|
-
import '@backstage/errors';
|
|
8
|
-
import '@backstage/plugin-home-react';
|
|
9
|
-
import 'luxon';
|
|
10
|
-
import '@material-ui/icons/OpenInBrowser';
|
|
11
|
-
import '../assets/emptystate.svg';
|
|
12
|
-
import 'react-use/lib/useAsyncFn';
|
|
13
|
-
import '@material-ui/lab';
|
|
14
|
-
import '../assets/forbiddenstate.svg';
|
|
15
|
-
import '@material-ui/core/Avatar';
|
|
16
|
-
import '@material-ui/icons/Notifications';
|
|
17
|
-
import 'react-use/lib/useAsync';
|
|
18
|
-
import '@material-ui/icons/Link';
|
|
19
|
-
import '../assets/PD-Green.svg';
|
|
20
|
-
import '../assets/PD-White.svg';
|
|
21
|
-
import 'validate-color';
|
|
22
|
-
import '@material-ui/icons/Info';
|
|
23
|
-
import '@material-ui/icons/CheckCircle';
|
|
24
|
-
import '@material-ui/icons/RadioButtonUnchecked';
|
|
25
|
-
import '@material-ui/core/styles';
|
|
26
|
-
import 'react-use';
|
|
27
|
-
import '@material-ui/lab/Alert/Alert';
|
|
28
|
-
import '@backstage/catalog-model';
|
|
29
|
-
import '@material-ui/icons/AddAlert';
|
|
30
|
-
import '@material-ui/icons/ExpandMore';
|
|
31
|
-
|
|
32
|
-
function getColorFromStatus(status) {
|
|
33
|
-
switch (status) {
|
|
34
|
-
case "InSync":
|
|
35
|
-
return "green";
|
|
36
|
-
case "OutOfSync":
|
|
37
|
-
return "red";
|
|
38
|
-
case "NotMapped":
|
|
39
|
-
return "orange";
|
|
40
|
-
default:
|
|
41
|
-
return "gray";
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const ServiceMappingComponent = () => {
|
|
45
|
-
const [catalogEntities, setCatalogEntities] = useState([]);
|
|
46
|
-
const [, setServiceMappings] = useState([]);
|
|
47
|
-
const [tableData, setTableData] = useState([]);
|
|
48
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
49
|
-
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
50
|
-
const catalogApi = useApi(catalogApiRef);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
async function fetchEntities() {
|
|
53
|
-
const { items } = await catalogApi.getEntities({
|
|
54
|
-
filter: { kind: "Component" }
|
|
55
|
-
});
|
|
56
|
-
const backstageServices = [];
|
|
57
|
-
items.forEach((entity) => {
|
|
58
|
-
var _a, _b, _c, _d, _e, _f;
|
|
59
|
-
backstageServices.push({
|
|
60
|
-
name: (_a = entity.metadata) == null ? void 0 : _a.name,
|
|
61
|
-
id: (_c = (_b = entity.metadata) == null ? void 0 : _b.uid) != null ? _c : "",
|
|
62
|
-
system: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.system) || "",
|
|
63
|
-
owner: JSON.stringify((_e = entity.spec) == null ? void 0 : _e.owner) || "",
|
|
64
|
-
lifecycle: JSON.stringify((_f = entity.spec) == null ? void 0 : _f.lifecycle) || ""
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
return backstageServices;
|
|
68
|
-
}
|
|
69
|
-
async function fetchServices() {
|
|
70
|
-
const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();
|
|
71
|
-
return foundServices;
|
|
72
|
-
}
|
|
73
|
-
if (catalogEntities.length === 0) {
|
|
74
|
-
Promise.all([fetchEntities(), fetchServices()]).then(
|
|
75
|
-
([entities, mappings]) => {
|
|
76
|
-
setCatalogEntities(entities);
|
|
77
|
-
setServiceMappings(mappings);
|
|
78
|
-
const data = buildTableData(
|
|
79
|
-
entities,
|
|
80
|
-
mappings
|
|
81
|
-
);
|
|
82
|
-
setTableData(data);
|
|
83
|
-
setIsLoading(false);
|
|
84
|
-
}
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
}, [catalogApi, catalogEntities, pagerDutyApi]);
|
|
88
|
-
function buildTableData(entities, mappings) {
|
|
89
|
-
const data = mappings.map((service) => {
|
|
90
|
-
return {
|
|
91
|
-
name: service.serviceName,
|
|
92
|
-
team: service.team,
|
|
93
|
-
escalationPolicy: service.escalationPolicy,
|
|
94
|
-
// status of mapping
|
|
95
|
-
mappingStatus: /* @__PURE__ */ React.createElement(
|
|
96
|
-
Typography,
|
|
97
|
-
{
|
|
98
|
-
variant: "body2",
|
|
99
|
-
style: {
|
|
100
|
-
color: getColorFromStatus(service.status)
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
service.status
|
|
104
|
-
),
|
|
105
|
-
mapping: (
|
|
106
|
-
// dropdown menu with static options. If service.mapping is defined select that option
|
|
107
|
-
/* @__PURE__ */ React.createElement(FormControl, { variant: "standard" }, /* @__PURE__ */ React.createElement(
|
|
108
|
-
Select,
|
|
109
|
-
{
|
|
110
|
-
displayEmpty: true,
|
|
111
|
-
onChange: (selection) => {
|
|
112
|
-
handleMappingChange(service, selection);
|
|
113
|
-
},
|
|
114
|
-
value: service.entityRef
|
|
115
|
-
},
|
|
116
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "" }, /* @__PURE__ */ React.createElement("em", null, "None")),
|
|
117
|
-
entities.map((backstageService) => {
|
|
118
|
-
return /* @__PURE__ */ React.createElement(
|
|
119
|
-
MenuItem,
|
|
120
|
-
{
|
|
121
|
-
key: backstageService.id,
|
|
122
|
-
value: backstageService.id
|
|
123
|
-
},
|
|
124
|
-
backstageService.name
|
|
125
|
-
);
|
|
126
|
-
})
|
|
127
|
-
))
|
|
128
|
-
),
|
|
129
|
-
actions: /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", href: service.serviceUrl }, "Open in PagerDuty")
|
|
130
|
-
};
|
|
131
|
-
});
|
|
132
|
-
return data;
|
|
133
|
-
}
|
|
134
|
-
async function handleMappingChange(service, event) {
|
|
135
|
-
const updatedData = [...tableData];
|
|
136
|
-
updatedData.findIndex((item) => item.name === service.serviceName);
|
|
137
|
-
await pagerDutyApi.storeServiceMapping(
|
|
138
|
-
service.serviceId,
|
|
139
|
-
event.target.value
|
|
140
|
-
);
|
|
141
|
-
setTableData(updatedData);
|
|
142
|
-
}
|
|
143
|
-
const DenseTable = ({ items }) => {
|
|
144
|
-
const columns = [
|
|
145
|
-
{ title: "PagerDuty Service", field: "name" },
|
|
146
|
-
{ title: "Team", field: "team" },
|
|
147
|
-
{ title: "Escalation Policy", field: "escalationPolicy" },
|
|
148
|
-
{ title: "Mapping", field: "mapping" },
|
|
149
|
-
{ title: "Status", field: "mappingStatus" },
|
|
150
|
-
{ title: "Actions", field: "actions" }
|
|
151
|
-
];
|
|
152
|
-
return /* @__PURE__ */ React.createElement(
|
|
153
|
-
Table,
|
|
154
|
-
{
|
|
155
|
-
isLoading,
|
|
156
|
-
title: "PagerDuty Service Import",
|
|
157
|
-
subtitle: "Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.",
|
|
158
|
-
options: {
|
|
159
|
-
search: true,
|
|
160
|
-
paging: true,
|
|
161
|
-
pageSize: 10,
|
|
162
|
-
pageSizeOptions: [10, 25, 50],
|
|
163
|
-
sorting: true,
|
|
164
|
-
emptyRowsWhenPaging: false,
|
|
165
|
-
showFirstLastPageButtons: true,
|
|
166
|
-
columnResizable: true,
|
|
167
|
-
columnsButton: true,
|
|
168
|
-
rowStyle: {
|
|
169
|
-
height: "10px"
|
|
170
|
-
},
|
|
171
|
-
padding: "dense"
|
|
172
|
-
},
|
|
173
|
-
columns,
|
|
174
|
-
data: items
|
|
175
|
-
}
|
|
176
|
-
);
|
|
177
|
-
};
|
|
178
|
-
return /* @__PURE__ */ React.createElement(DenseTable, { items: tableData });
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
const PagerDutyPage = () => {
|
|
182
|
-
return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(Header, { title: "PagerDuty", subtitle: "Advanced configurations" }), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(ServiceMappingComponent, null)))));
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
export { PagerDutyPage };
|
|
186
|
-
//# sourceMappingURL=index-e3fee98b.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-e3fee98b.esm.js","sources":["../../src/components/PagerDutyPage/ServiceMappingComponent.tsx","../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import React, { ChangeEvent, useEffect, useState } from \"react\";\nimport { Table, TableColumn } from \"@backstage/core-components\";\nimport {\n Button,\n FormControl,\n MenuItem,\n Select,\n Typography,\n} from \"@material-ui/core\";\nimport { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { pagerDutyApiRef } from \"../../api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport { Entity } from \"@backstage/catalog-model\";\n\ntype Service = {\n name: string; // \"Ads\"\n id: string; // \"QWe1j283n12j132\"\n system: string; // \"Production\"\n owner: string; // \"Mapped\"\n lifecycle: string; // \"Ads\"\n};\n\ntype TableItem = {\n name: string | undefined;\n team: string | undefined;\n escalationPolicy: string | undefined;\n mappingStatus: JSX.Element;\n mapping: JSX.Element;\n actions: JSX.Element;\n};\n\ntype DenseTableProps = {\n items: TableItem[];\n};\n\nfunction getColorFromStatus(status?: string) {\n switch (status) {\n case \"InSync\":\n return \"green\";\n case \"OutOfSync\":\n return \"red\";\n case \"NotMapped\":\n return \"orange\";\n default:\n return \"gray\";\n }\n}\n\nexport const ServiceMappingComponent = () => {\n const [catalogEntities, setCatalogEntities] = useState<Service[]>([]);\n const [, setServiceMappings] = useState<PagerDutyEntityMapping[]>([]);\n const [tableData, setTableData] = useState<TableItem[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n useEffect(() => {\n async function fetchEntities(): Promise<Service[]> {\n const { items } = await catalogApi.getEntities({\n filter: { kind: \"Component\" },\n });\n\n const backstageServices: Service[] = [];\n items.forEach((entity: Entity) => {\n backstageServices.push({\n name: entity.metadata?.name,\n id: entity.metadata?.uid ?? \"\",\n system: JSON.stringify(entity.spec?.system) || \"\",\n owner: JSON.stringify(entity.spec?.owner) || \"\",\n lifecycle: JSON.stringify(entity.spec?.lifecycle) || \"\",\n });\n });\n\n return backstageServices;\n }\n\n async function fetchServices(): Promise<PagerDutyEntityMapping[]> {\n const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();\n\n return foundServices;\n }\n\n if (catalogEntities.length === 0) {\n Promise.all([fetchEntities(), fetchServices()]).then(\n ([entities, mappings]) => {\n setCatalogEntities(entities);\n setServiceMappings(mappings);\n\n const data: TableItem[] = buildTableData(\n entities,\n mappings\n );\n\n setTableData(data);\n setIsLoading(false);\n }\n );\n }\n }, [catalogApi, catalogEntities, pagerDutyApi]);\n\n function buildTableData(\n entities: Service[],\n mappings: PagerDutyEntityMapping[]\n ): TableItem[] {\n const data: TableItem[] = mappings.map((service) => {\n return {\n name: service.serviceName,\n team: service.team,\n escalationPolicy: service.escalationPolicy,\n // status of mapping\n mappingStatus: (\n <Typography\n variant=\"body2\"\n style={{\n color: getColorFromStatus(service.status),\n }}\n >\n {service.status}\n </Typography>\n ),\n mapping: (\n // dropdown menu with static options. If service.mapping is defined select that option\n <FormControl variant=\"standard\">\n <Select\n displayEmpty\n onChange={(selection) => {\n handleMappingChange(service, selection);\n \n }}\n value={service.entityRef}\n >\n <MenuItem value=\"\">\n <em>None</em>\n </MenuItem>\n {entities.map((backstageService) => {\n return (\n <MenuItem\n key={backstageService.id}\n value={backstageService.id}\n >\n {backstageService.name}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n ),\n actions: (\n <Button variant=\"contained\" color=\"primary\" href={service.serviceUrl}>\n Open in PagerDuty\n </Button>\n ),\n };\n });\n\n return data;\n }\n\n async function handleMappingChange(\n service: PagerDutyEntityMapping,\n event: ChangeEvent<{\n name?: string | undefined;\n value: unknown;\n }>\n ) {\n // event.preventDefault();\n const updatedData = [...tableData];\n\n // find the service in updatedData\n updatedData.findIndex((item) => item.name === service.serviceName);\n // // updatedData[serviceIndex].mappingStatus = (\n // // <Typography\n // // variant=\"body2\"\n // // style={{\n // // color: getColorFromStatus(\"OutOfSync\"),\n // // }}\n // // >\n // // \"OutOfSync\"\n // // </Typography>\n // // );\n\n // // update the mapping status\n // // service.status = \"OutOfSync\";\n\n // // // update the mapping\n // // service.entityRef = entityId;\n\n // // store the mapping in the database\n await pagerDutyApi.storeServiceMapping(\n service.serviceId,\n event.target.value as string\n );\n setTableData(updatedData);\n }\n\n const DenseTable = ({ items }: DenseTableProps) => {\n // const [data, _] = useState<TableItem[]>(items);\n\n // useEffect(() => {\n // setData(items);\n // }, [items]);\n\n const columns: TableColumn[] = [\n { title: \"PagerDuty Service\", field: \"name\" },\n { title: \"Team\", field: \"team\" },\n { title: \"Escalation Policy\", field: \"escalationPolicy\" },\n { title: \"Mapping\", field: \"mapping\" },\n { title: \"Status\", field: \"mappingStatus\" },\n { title: \"Actions\", field: \"actions\" },\n ];\n\n return (\n <Table\n isLoading={isLoading}\n title=\"PagerDuty Service Import\"\n subtitle=\"Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.\"\n options={{\n search: true,\n paging: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50],\n sorting: true,\n emptyRowsWhenPaging: false,\n showFirstLastPageButtons: true,\n columnResizable: true,\n columnsButton: true,\n rowStyle: {\n height: \"10px\",\n },\n padding: \"dense\",\n }}\n columns={columns}\n data={items}\n />\n );\n };\n\n return <DenseTable items={tableData} />;\n};\n","import React from \"react\";\nimport { Grid } from \"@material-ui/core\";\nimport { Header, Page, Content } from \"@backstage/core-components\";\nimport { ServiceMappingComponent } from \"./ServiceMappingComponent\";\n\n/** @public */\nexport const PagerDutyPage = () => {\n return (\n <Page themeId=\"home\">\n <Header title=\"PagerDuty\" subtitle=\"Advanced configurations\" />\n <Content>\n {/* <Grid container spacing={3} direction=\"column\">\n <Grid item alignContent=\"flex-end\">\n <Button variant=\"contained\" color=\"primary\" onClick={() => {handleImport()}}>\n Import\n </Button>\n <Button variant=\"outlined\" color=\"primary\" onClick={() => {handleSave()}}>\n Save\n </Button>\n </Grid>\n </Grid> */}\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ServiceMappingComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAS,mBAAmB,MAAiB,EAAA;AAC3C,EAAA,QAAQ,MAAQ;AAAA,IACd,KAAK,QAAA;AACH,MAAO,OAAA,OAAA,CAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAO,OAAA,KAAA,CAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAO,OAAA,QAAA,CAAA;AAAA,IACT;AACE,MAAO,OAAA,MAAA,CAAA;AAAA,GACX;AACF,CAAA;AAEO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAoB,EAAE,CAAA,CAAA;AACpE,EAAA,MAAM,GAAG,kBAAkB,CAAI,GAAA,QAAA,CAAmC,EAAE,CAAA,CAAA;AACpE,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA,CAAsB,EAAE,CAAA,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AAE/C,EAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA,CAAA;AAC3C,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AAEvC,EAAA,SAAA,CAAU,MAAM;AAChB,IAAA,eAAe,aAAoC,GAAA;AACjD,MAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,WAAW,WAAY,CAAA;AAAA,QAC7C,MAAA,EAAQ,EAAE,IAAA,EAAM,WAAY,EAAA;AAAA,OAC7B,CAAA,CAAA;AAED,MAAA,MAAM,oBAA+B,EAAC,CAAA;AACtC,MAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,MAAmB,KAAA;AAjEtC,QAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAkEM,QAAA,iBAAA,CAAkB,IAAK,CAAA;AAAA,UACrB,IAAA,EAAA,CAAM,EAAO,GAAA,MAAA,CAAA,QAAA,KAAP,IAAiB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAAA,UACvB,EAAI,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAiB,QAAjB,IAAwB,GAAA,EAAA,GAAA,EAAA;AAAA,UAC5B,QAAQ,IAAK,CAAA,SAAA,CAAA,CAAU,YAAO,IAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,MAAM,CAAK,IAAA,EAAA;AAAA,UAC/C,OAAO,IAAK,CAAA,SAAA,CAAA,CAAU,YAAO,IAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,KAAK,CAAK,IAAA,EAAA;AAAA,UAC7C,WAAW,IAAK,CAAA,SAAA,CAAA,CAAU,YAAO,IAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,SAAS,CAAK,IAAA,EAAA;AAAA,SACtD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAED,MAAO,OAAA,iBAAA,CAAA;AAAA,KACT;AAEA,IAAA,eAAe,aAAmD,GAAA;AAChE,MAAA,MAAM,EAAE,QAAU,EAAA,aAAA,EAAkB,GAAA,MAAM,aAAa,iBAAkB,EAAA,CAAA;AAEzE,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAI,IAAA,eAAA,CAAgB,WAAW,CAAG,EAAA;AAChC,MAAA,OAAA,CAAQ,IAAI,CAAC,aAAA,IAAiB,aAAc,EAAC,CAAC,CAAE,CAAA,IAAA;AAAA,QAC9C,CAAC,CAAC,QAAU,EAAA,QAAQ,CAAM,KAAA;AACxB,UAAA,kBAAA,CAAmB,QAAQ,CAAA,CAAA;AAC3B,UAAA,kBAAA,CAAmB,QAAQ,CAAA,CAAA;AAE3B,UAAA,MAAM,IAAoB,GAAA,cAAA;AAAA,YACxB,QAAA;AAAA,YACA,QAAA;AAAA,WACF,CAAA;AAEA,UAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AACjB,UAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,SACpB;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACG,EAAA,CAAC,UAAY,EAAA,eAAA,EAAiB,YAAY,CAAC,CAAA,CAAA;AAE9C,EAAS,SAAA,cAAA,CACP,UACA,QACa,EAAA;AACb,IAAA,MAAM,IAAoB,GAAA,QAAA,CAAS,GAAI,CAAA,CAAC,OAAY,KAAA;AAClD,MAAO,OAAA;AAAA,QACL,MAAM,OAAQ,CAAA,WAAA;AAAA,QACd,MAAM,OAAQ,CAAA,IAAA;AAAA,QACd,kBAAkB,OAAQ,CAAA,gBAAA;AAAA;AAAA,QAE1B,aACE,kBAAA,KAAA,CAAA,aAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAQ,EAAA,OAAA;AAAA,YACR,KAAO,EAAA;AAAA,cACL,KAAA,EAAO,kBAAmB,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,aAC1C;AAAA,WAAA;AAAA,UAEC,OAAQ,CAAA,MAAA;AAAA,SACX;AAAA,QAEF,OAAA;AAAA;AAAA,0BAEE,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,OAAA,EAAQ,UACnB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,YAAY,EAAA,IAAA;AAAA,cACZ,QAAA,EAAU,CAAC,SAAc,KAAA;AACvB,gBAAA,mBAAA,CAAoB,SAAS,SAAS,CAAA,CAAA;AAAA,eAExC;AAAA,cACA,OAAO,OAAQ,CAAA,SAAA;AAAA,aAAA;AAAA,gDAEd,QAAS,EAAA,EAAA,KAAA,EAAM,sBACb,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAA,EAAG,MAAI,CACV,CAAA;AAAA,YACC,QAAA,CAAS,GAAI,CAAA,CAAC,gBAAqB,KAAA;AAClC,cACE,uBAAA,KAAA,CAAA,aAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,KAAK,gBAAiB,CAAA,EAAA;AAAA,kBACtB,OAAO,gBAAiB,CAAA,EAAA;AAAA,iBAAA;AAAA,gBAEvB,gBAAiB,CAAA,IAAA;AAAA,eACpB,CAAA;AAAA,aAEH,CAAA;AAAA,WAEL,CAAA;AAAA,SAAA;AAAA,QAEF,OAAA,kBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,OAAQ,EAAA,WAAA,EAAY,OAAM,SAAU,EAAA,IAAA,EAAM,OAAQ,CAAA,UAAA,EAAA,EAAY,mBAEtE,CAAA;AAAA,OAEJ,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAe,eAAA,mBAAA,CACb,SACA,KAIA,EAAA;AAEA,IAAM,MAAA,WAAA,GAAc,CAAC,GAAG,SAAS,CAAA,CAAA;AAGjC,IAAA,WAAA,CAAY,UAAU,CAAC,IAAA,KAAS,IAAK,CAAA,IAAA,KAAS,QAAQ,WAAW,CAAA,CAAA;AAmBjE,IAAA,MAAM,YAAa,CAAA,mBAAA;AAAA,MACjB,OAAQ,CAAA,SAAA;AAAA,MACR,MAAM,MAAO,CAAA,KAAA;AAAA,KACf,CAAA;AACA,IAAA,YAAA,CAAa,WAAW,CAAA,CAAA;AAAA,GAC1B;AAEA,EAAA,MAAM,UAAa,GAAA,CAAC,EAAE,KAAA,EAA6B,KAAA;AAOjD,IAAA,MAAM,OAAyB,GAAA;AAAA,MAC7B,EAAE,KAAA,EAAO,mBAAqB,EAAA,KAAA,EAAO,MAAO,EAAA;AAAA,MAC5C,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,MAAO,EAAA;AAAA,MAC/B,EAAE,KAAA,EAAO,mBAAqB,EAAA,KAAA,EAAO,kBAAmB,EAAA;AAAA,MACxD,EAAE,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,SAAU,EAAA;AAAA,MACrC,EAAE,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,eAAgB,EAAA;AAAA,MAC1C,EAAE,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,SAAU,EAAA;AAAA,KACvC,CAAA;AAEA,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,KAAM,EAAA,0BAAA;AAAA,QACN,QAAS,EAAA,2HAAA;AAAA,QACT,OAAS,EAAA;AAAA,UACP,MAAQ,EAAA,IAAA;AAAA,UACR,MAAQ,EAAA,IAAA;AAAA,UACR,QAAU,EAAA,EAAA;AAAA,UACV,eAAiB,EAAA,CAAC,EAAI,EAAA,EAAA,EAAI,EAAE,CAAA;AAAA,UAC5B,OAAS,EAAA,IAAA;AAAA,UACT,mBAAqB,EAAA,KAAA;AAAA,UACrB,wBAA0B,EAAA,IAAA;AAAA,UAC1B,eAAiB,EAAA,IAAA;AAAA,UACjB,aAAe,EAAA,IAAA;AAAA,UACf,QAAU,EAAA;AAAA,YACR,MAAQ,EAAA,MAAA;AAAA,WACV;AAAA,UACA,OAAS,EAAA,OAAA;AAAA,SACX;AAAA,QACA,OAAA;AAAA,QACA,IAAM,EAAA,KAAA;AAAA,OAAA;AAAA,KACR,CAAA;AAAA,GAEJ,CAAA;AAEA,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAO,SAAW,EAAA,CAAA,CAAA;AACvC,CAAA;;AC1OO,MAAM,gBAAgB,MAAM;AACjC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,MAAA,EAAA,kBACX,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,KAAM,EAAA,WAAA,EAAY,QAAS,EAAA,yBAAA,EAA0B,CAC7D,kBAAA,KAAA,CAAA,aAAA,CAAC,+BAWE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,OAAS,EAAA,CAAA,EAAG,SAAU,EAAA,QAAA,EAAA,kBACnC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAA,kBACP,KAAA,CAAA,aAAA,CAAA,uBAAA,EAAA,IAAwB,CAC3B,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
|