@abhi1693/medusa-rbac 0.0.1 → 0.0.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 (35) hide show
  1. package/.medusa/server/src/admin/index.js +43 -25
  2. package/.medusa/server/src/admin/index.mjs +43 -25
  3. package/.medusa/server/src/admin/lib/access.d.ts +6 -3
  4. package/.medusa/server/src/admin/lib/access.js +1 -1
  5. package/.medusa/server/src/api/admin/access/me/route.js +3 -1
  6. package/.medusa/server/src/api/admin/access/permissions/route.js +4 -1
  7. package/.medusa/server/src/api/middlewares/enforce-admin-access.js +49 -61
  8. package/.medusa/server/src/index.d.ts +1 -0
  9. package/.medusa/server/src/index.js +2 -1
  10. package/.medusa/server/src/lib/access/config.d.ts +6 -0
  11. package/.medusa/server/src/lib/access/config.js +110 -14
  12. package/.medusa/server/src/lib/access/explain.d.ts +1 -1
  13. package/.medusa/server/src/lib/access/explain.js +3 -2
  14. package/.medusa/server/src/lib/access/immutable-config.d.ts +2 -0
  15. package/.medusa/server/src/lib/access/immutable-config.js +17 -0
  16. package/.medusa/server/src/lib/access/native-resources.d.ts +3 -0
  17. package/.medusa/server/src/lib/access/native-resources.js +444 -0
  18. package/.medusa/server/src/lib/access/permission-key.d.ts +1 -1
  19. package/.medusa/server/src/lib/access/permission-key.js +3 -2
  20. package/.medusa/server/src/lib/access/permissions.d.ts +7 -0
  21. package/.medusa/server/src/lib/access/permissions.js +15 -2
  22. package/.medusa/server/src/lib/access/policy.d.ts +12 -3
  23. package/.medusa/server/src/lib/access/policy.js +149 -264
  24. package/.medusa/server/src/lib/access/resources.d.ts +107 -0
  25. package/.medusa/server/src/lib/access/resources.js +363 -0
  26. package/.medusa/server/src/lib/access/route-facts.d.ts +24 -0
  27. package/.medusa/server/src/lib/access/route-facts.js +77 -0
  28. package/.medusa/server/src/lib/access/write-permissions.d.ts +2 -0
  29. package/.medusa/server/src/lib/access/write-permissions.js +40 -0
  30. package/.medusa/server/src/modules/access-control/service.d.ts +4 -0
  31. package/.medusa/server/src/modules/access-control/service.js +8 -3
  32. package/.medusa/server/src/resources.d.ts +2 -0
  33. package/.medusa/server/src/resources.js +18 -0
  34. package/README.md +71 -9
  35. package/package.json +11 -7
@@ -0,0 +1,444 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.nativeResources = void 0;
7
+ exports.describeNative = describeNative;
8
+ const native_routes_json_1 = __importDefault(require("./native-routes.json"));
9
+ const route_facts_1 = require("./route-facts");
10
+ const resources_1 = require("./resources");
11
+ const write_permissions_1 = require("./write-permissions");
12
+ const immutable_config_1 = require("./immutable-config");
13
+ const read = (...permissions) => ({ permissions });
14
+ const commerce = {
15
+ products: {
16
+ read: read("products.view", "prices.view"),
17
+ write: read("products.edit"),
18
+ },
19
+ "product-variants": {
20
+ read: read("products.view", "prices.view"),
21
+ write: read("products.edit"),
22
+ },
23
+ "product-categories": {
24
+ read: read("categories.view"),
25
+ write: read("categories.manage"),
26
+ },
27
+ collections: {
28
+ read: read("collections.view"),
29
+ write: read("collections.manage"),
30
+ },
31
+ "product-types": {
32
+ read: read("products.view"),
33
+ write: read("product_options.manage"),
34
+ },
35
+ "product-tags": {
36
+ read: read("products.view"),
37
+ write: read("product_options.manage"),
38
+ },
39
+ "product-options": {
40
+ read: read("products.view"),
41
+ write: read("product_options.manage"),
42
+ },
43
+ "product-option-values": {
44
+ read: read("products.view"),
45
+ write: read("product_options.manage"),
46
+ },
47
+ "price-lists": { read: read("prices.view"), write: read("prices.edit") },
48
+ "price-preferences": {
49
+ read: read("prices.view"),
50
+ write: read("prices.edit"),
51
+ },
52
+ "inventory-items": {
53
+ read: read("inventory.view", "products.view", "prices.view", "stock_locations.view"),
54
+ write: read("inventory.adjust"),
55
+ },
56
+ "stock-locations": {
57
+ read: read("stock_locations.view"),
58
+ write: read("stock_locations.manage"),
59
+ },
60
+ reservations: {
61
+ read: read("inventory.view", "products.view", "prices.view"),
62
+ write: read("inventory.adjust"),
63
+ },
64
+ orders: {
65
+ read: read("orders.view"),
66
+ write: read("orders.manage"),
67
+ },
68
+ "order-changes": {
69
+ read: read("orders.view"),
70
+ write: read("orders.manage"),
71
+ },
72
+ "draft-orders": {
73
+ read: read("orders.view"),
74
+ write: read("orders.manage"),
75
+ },
76
+ returns: {
77
+ read: read("orders.view"),
78
+ write: read("orders.manage"),
79
+ },
80
+ exchanges: {
81
+ read: read("orders.view"),
82
+ write: read("orders.manage"),
83
+ },
84
+ claims: {
85
+ read: read("orders.view"),
86
+ write: read("orders.manage"),
87
+ },
88
+ fulfillments: { read: read("orders.view"), write: read("orders.manage") },
89
+ customers: { read: read("customers.view"), write: read("customers.manage") },
90
+ "customer-groups": {
91
+ read: read("customers.view"),
92
+ write: read("customers.manage"),
93
+ },
94
+ payments: { read: read("payments.view"), write: read("payments.capture") },
95
+ "payment-collections": {
96
+ read: read("payments.view"),
97
+ write: read("payments.capture"),
98
+ },
99
+ promotions: {
100
+ read: read("promotions.view"),
101
+ write: read("promotions.manage"),
102
+ },
103
+ campaigns: {
104
+ read: read("promotions.view"),
105
+ write: read("promotions.manage"),
106
+ },
107
+ uploads: { read: read("media.manage"), write: read("media.manage") },
108
+ };
109
+ const settings = [
110
+ "stores",
111
+ "regions",
112
+ "currencies",
113
+ "countries",
114
+ "sales-channels",
115
+ "shipping-profiles",
116
+ "shipping-options",
117
+ "shipping-option-types",
118
+ "fulfillment-providers",
119
+ "fulfillment-sets",
120
+ "tax-regions",
121
+ "tax-rates",
122
+ "tax-providers",
123
+ "return-reasons",
124
+ "refund-reasons",
125
+ "locales",
126
+ "translations",
127
+ ];
128
+ for (const resource of settings)
129
+ commerce[resource] = {
130
+ read: read("settings.view"),
131
+ write: read("settings.manage"),
132
+ };
133
+ // Reviewed structural vocabulary, independent of request URLs. Unrecognized
134
+ // members stay unclassified when a future native inventory adds a command.
135
+ const members = {
136
+ campaigns: "promotions",
137
+ claims: "cancel claim-items inbound items outbound request shipping-method",
138
+ collections: "products",
139
+ "customer-groups": "customers",
140
+ customers: "addresses customer-groups export",
141
+ "draft-orders": "confirm convert-to-order edit item items method promotions request shipping-methods",
142
+ exchanges: "cancel inbound items outbound request shipping-method",
143
+ "fulfillment-providers": "options",
144
+ "fulfillment-sets": "service-zones",
145
+ fulfillments: "cancel shipment",
146
+ "inventory-items": "batch export location-levels",
147
+ orders: "archive authorize cancel changes complete credit-lines export fulfillments guest line-items mark-as-delivered payment-sessions preview shipments shipping-options transfer",
148
+ "payment-collections": "mark-as-paid payment-sessions",
149
+ payments: "capture payment-providers refund",
150
+ "price-lists": "batch prices products",
151
+ "product-categories": "products",
152
+ "product-options": "values",
153
+ products: "batch confirm export images import imports inventory-items options variants",
154
+ promotions: "batch buy-rules rule-attribute-options rule-value-options rules target-rules",
155
+ returns: "cancel confirm dismiss-items receive receive-items request request-items shipping-method",
156
+ "sales-channels": "products",
157
+ "shipping-options": "batch rules",
158
+ "stock-locations": "fulfillment-providers fulfillment-sets sales-channels",
159
+ "tax-rates": "rules",
160
+ translations: "batch entities settings statistics",
161
+ uploads: "presigned-urls",
162
+ users: "auth-providers me reset-password roles",
163
+ invites: "accept resend",
164
+ };
165
+ const commands = {
166
+ products: { import: "import", imports: "import", export: "export" },
167
+ "product-variants": { import: "import", imports: "import", export: "export" },
168
+ orders: { cancel: "cancel", export: "denied" },
169
+ "draft-orders": { cancel: "cancel" },
170
+ payments: { refund: "refund" },
171
+ customers: { export: "denied" },
172
+ "inventory-items": { export: "denied" },
173
+ };
174
+ const personalFields = ["id", "email", "first_name", "last_name", "avatar_url"];
175
+ const editableProfileFields = ["first_name", "last_name", "avatar_url"];
176
+ function addAction(profile, facts, action) {
177
+ let node = profile;
178
+ for (const segment of facts.segments) {
179
+ if (segment.kind === "literal") {
180
+ const children = (node.children ||= {});
181
+ node = children[segment.value] ||= {};
182
+ }
183
+ else {
184
+ node.item ||= { parameter: segment.name, profile: {} };
185
+ if (node.item.parameter !== segment.name)
186
+ throw new Error("Conflicting native parameter grammar");
187
+ node = node.item.profile;
188
+ }
189
+ }
190
+ node.actions ||= {};
191
+ node.actions[facts.method] = action;
192
+ }
193
+ function compileNative(resource, policies) {
194
+ const profile = {};
195
+ const product = ["products", "product-variants"].includes(resource);
196
+ const operations = {
197
+ read: policies.read,
198
+ write: policies.write,
199
+ create: read("products.create"),
200
+ delete: read("products.delete"),
201
+ import: read("products.import", "products.create", "products.edit", "prices.edit"),
202
+ export: read("products.view", "prices.view", "products.export"),
203
+ refund: read("refunds.issue"),
204
+ cancel: read("orders.cancel"),
205
+ bootstrap: { permissions: [], access: "authenticated" },
206
+ public: { permissions: [], access: "public" },
207
+ };
208
+ for (const route of native_routes_json_1.default.filter((route) => route.path.split("/")[2] === resource)) {
209
+ for (const method of route.methods) {
210
+ const facts = (0, route_facts_1.matchRoute)([route], method, route.path.replace(/:[^/]+/g, "opaque"));
211
+ const literals = facts.segments
212
+ .filter((segment) => segment.kind === "literal")
213
+ .map((segment) => segment.value);
214
+ if (literals.some((literal) => !(members[resource] || "").split(" ").includes(literal)))
215
+ continue;
216
+ const command = literals
217
+ .map((literal) => commands[resource]?.[literal])
218
+ .find(Boolean);
219
+ if (command === "denied")
220
+ continue;
221
+ let operation = command || (method === "GET" ? "read" : "write");
222
+ if (product && !command) {
223
+ if (method === "DELETE")
224
+ operation = "delete";
225
+ if (resource === "products" &&
226
+ method === "POST" &&
227
+ !facts.segments.length)
228
+ operation = "create";
229
+ }
230
+ const variantCollection = facts.segments.length === 2 &&
231
+ facts.segments[0].kind === "parameter" &&
232
+ facts.segments[1].kind === "literal" &&
233
+ facts.segments[1].value === "variants";
234
+ const variantItem = facts.segments.length === 3 &&
235
+ facts.segments[2].kind === "parameter" &&
236
+ facts.segments[1].kind === "literal" &&
237
+ facts.segments[1].value === "variants";
238
+ const action = {
239
+ operation,
240
+ fieldResource: resource === "products" && (variantCollection || variantItem)
241
+ ? "product-variants"
242
+ : resource,
243
+ };
244
+ if (product && method !== "GET")
245
+ action.payload = (request) => (0, write_permissions_1.additionalWritePermissions)(request.body, method === "POST" && (operation === "create" || variantCollection));
246
+ if (resource === "stores" && method === "GET" && !facts.segments.length) {
247
+ action.operation = "bootstrap";
248
+ action.fallbackFields = {
249
+ permissions: ["settings.view"],
250
+ fields: ["id", "name"],
251
+ };
252
+ }
253
+ addAction(profile, facts, action);
254
+ }
255
+ }
256
+ return {
257
+ key: resource,
258
+ root: resource,
259
+ actorTypes: ["user"],
260
+ profile,
261
+ operations,
262
+ };
263
+ }
264
+ function accountResource(root) {
265
+ const profile = {};
266
+ const operations = {
267
+ read: { permissions: ["staff.view"], superuser: true },
268
+ manage: { permissions: [], superuser: true },
269
+ self: { permissions: [], access: "authenticated" },
270
+ public: { permissions: [], access: "public" },
271
+ };
272
+ for (const route of native_routes_json_1.default.filter((route) => route.path.split("/")[2] === root)) {
273
+ for (const method of route.methods) {
274
+ const facts = (0, route_facts_1.matchRoute)([route], method, route.path.replace(/:[^/]+/g, "opaque"));
275
+ const action = {
276
+ operation: root === "users" && method === "GET" ? "read" : "manage",
277
+ };
278
+ if (root === "users") {
279
+ const item = facts.segments.length === 1 && facts.segments[0].kind === "parameter";
280
+ const reset = facts.segments.length === 2 &&
281
+ facts.segments[0].kind === "parameter" &&
282
+ facts.segments[1].kind === "literal" &&
283
+ facts.segments[1].value === "reset-password";
284
+ if (method !== "GET" &&
285
+ !((method === "POST" && (item || reset)) ||
286
+ (method === "DELETE" && item)))
287
+ continue;
288
+ if (method === "POST" && item)
289
+ action.self = {
290
+ parameter: "id",
291
+ fields: editableProfileFields,
292
+ responseFields: personalFields,
293
+ };
294
+ if (method === "DELETE")
295
+ action.redirect = {
296
+ destination: "/admin/access/staff/:id",
297
+ parameter: "id",
298
+ };
299
+ if (method === "GET" &&
300
+ facts.segments.length === 1 &&
301
+ facts.segments[0].kind === "literal" &&
302
+ facts.segments[0].value === "me") {
303
+ action.operation = "self";
304
+ action.forceFields = personalFields;
305
+ }
306
+ }
307
+ else if (method === "POST" &&
308
+ facts.segments.length === 1 &&
309
+ facts.segments[0].kind === "literal" &&
310
+ facts.segments[0].value === "accept")
311
+ action.operation = "public";
312
+ addAction(profile, facts, action);
313
+ }
314
+ }
315
+ return { key: root, root, profile, operations, actorTypes: ["user"] };
316
+ }
317
+ const management = {
318
+ key: "access",
319
+ root: "access",
320
+ actorTypes: ["user"],
321
+ operations: {
322
+ self: { permissions: [], access: "authenticated" },
323
+ roles: read("roles.view"),
324
+ staff: read("staff.view"),
325
+ audit: read("audit.view"),
326
+ manage: { permissions: [], superuser: true },
327
+ },
328
+ profile: {
329
+ children: {
330
+ me: { actions: { GET: "self" } },
331
+ permissions: { actions: { GET: "roles" } },
332
+ audit: { actions: { GET: "audit" } },
333
+ roles: {
334
+ actions: { GET: "roles", POST: "manage" },
335
+ item: {
336
+ parameter: "id",
337
+ profile: {
338
+ actions: { GET: "roles", POST: "manage", DELETE: "manage" },
339
+ },
340
+ },
341
+ },
342
+ staff: {
343
+ actions: { GET: "staff" },
344
+ item: {
345
+ parameter: "id",
346
+ profile: {
347
+ actions: { GET: "staff", POST: "manage", DELETE: "manage" },
348
+ },
349
+ },
350
+ },
351
+ invites: {
352
+ actions: { GET: "manage", POST: "manage" },
353
+ item: { parameter: "id", profile: { actions: { DELETE: "manage" } } },
354
+ },
355
+ evaluate: { actions: { POST: "manage" } },
356
+ actors: {
357
+ item: {
358
+ parameter: "actor_type",
359
+ profile: {
360
+ actions: { GET: "manage" },
361
+ item: {
362
+ parameter: "id",
363
+ profile: { actions: { GET: "manage", POST: "manage" } },
364
+ },
365
+ },
366
+ },
367
+ },
368
+ },
369
+ },
370
+ };
371
+ const layouts = {
372
+ key: "layouts",
373
+ root: "layouts",
374
+ actorTypes: ["user"],
375
+ profile: (0, resources_1.actorOwnedPreferences)({
376
+ parameter: "zone",
377
+ member: "configuration",
378
+ list: "configurations",
379
+ sharedField: "is_default",
380
+ }),
381
+ operations: {
382
+ read: read(),
383
+ save: {
384
+ permissions: [],
385
+ scopes: { personal: [], shared: ["settings.manage"] },
386
+ },
387
+ reset: { permissions: [], scopes: { personal: [] } },
388
+ },
389
+ };
390
+ exports.nativeResources = (0, immutable_config_1.immutableConfig)([
391
+ ...Object.entries(commerce).map(([root, policies]) => compileNative(root, policies)),
392
+ accountResource("users"),
393
+ accountResource("invites"),
394
+ management,
395
+ layouts,
396
+ ...["plugins", "feature-flags"].map((root) => ({
397
+ key: root,
398
+ root,
399
+ actorTypes: ["user"],
400
+ profile: { actions: { GET: "read" } },
401
+ operations: {
402
+ read: {
403
+ permissions: [],
404
+ access: root === "feature-flags" ? "public" : "authenticated",
405
+ },
406
+ },
407
+ })),
408
+ ].map((resource) => ({
409
+ ...resource,
410
+ fieldRequirements: [
411
+ { pattern: /inventory/, permissions: ["inventory.view"] },
412
+ ...(resource.root === "orders"
413
+ ? [
414
+ {
415
+ pattern: /(?:^|,)\s*[+-]?\*?payment_collections\.(?:payment_sessions|payments\.refunds\.refund_reason)\s*(?:,|$)/,
416
+ permissions: ["payments.view"],
417
+ },
418
+ ]
419
+ : []),
420
+ ...(resource.root === "stock-locations"
421
+ ? [
422
+ {
423
+ pattern: /(?:^|,)\s*[+-]?\*?(?:fulfillment_sets|fulfillment_providers|sales_channels)(?:\.|\s*(?:,|$))/,
424
+ permissions: ["settings.view"],
425
+ },
426
+ ]
427
+ : []),
428
+ ],
429
+ })));
430
+ const nativeMatcher = (0, route_facts_1.createRouteMatcher)(native_routes_json_1.default);
431
+ const managementDefinition = exports.nativeResources.find((resource) => resource.key === "access");
432
+ const managementMatcher = (0, route_facts_1.createRouteMatcher)((0, resources_1.resourceRoutes)(managementDefinition));
433
+ function describeNative(method, url, body, actorId) {
434
+ const facts = nativeMatcher(method, url);
435
+ if (!facts) {
436
+ const custom = managementMatcher(method, url);
437
+ return custom
438
+ ? (0, resources_1.describeResource)(managementDefinition, custom, body, actorId)
439
+ : null;
440
+ }
441
+ const resource = exports.nativeResources.find((resource) => resource.root === facts.root);
442
+ return resource ? (0, resources_1.describeResource)(resource, facts, body, actorId) : null;
443
+ }
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLXJlc291cmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWNjZXNzL25hdGl2ZS1yZXNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBK2ZBLHdDQWlCQztBQWhoQkQsOEVBQStDO0FBQy9DLCtDQUtzQjtBQUN0QiwyQ0FRb0I7QUFDcEIsMkRBQWdFO0FBQ2hFLHlEQUFvRDtBQUNwRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsV0FBcUIsRUFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0FBQzlFLE1BQU0sUUFBUSxHQUdWO0lBQ0YsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDO1FBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzdCO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDO1FBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzdCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0tBQ2pDO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDO0tBQ2xDO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztLQUN0QztJQUNELGNBQWMsRUFBRTtRQUNkLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUM7S0FDdEM7SUFDRCxpQkFBaUIsRUFBRTtRQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDO0tBQ3RDO0lBQ0QsdUJBQXVCLEVBQUU7UUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztLQUN0QztJQUNELGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtJQUN4RSxtQkFBbUIsRUFBRTtRQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUMzQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQ1IsZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixhQUFhLEVBQ2Isc0JBQXNCLENBQ3ZCO1FBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztLQUNoQztJQUNELGlCQUFpQixFQUFFO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDbEMsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztLQUN0QztJQUNELFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQztRQUM1RCxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0tBQ2hDO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7S0FDN0I7SUFDRCxlQUFlLEVBQUU7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztLQUM3QjtJQUNELGNBQWMsRUFBRTtRQUNkLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7S0FDN0I7SUFDRCxTQUFTLEVBQUU7UUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztLQUM3QjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzdCO0lBQ0QsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO0lBQ3pFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7SUFDNUUsaUJBQWlCLEVBQUU7UUFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QixLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0tBQ2hDO0lBQ0QsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7SUFDMUUscUJBQXFCLEVBQUU7UUFDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztLQUNoQztJQUNELFVBQVUsRUFBRTtRQUNWLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztLQUNqQztJQUNELFNBQVMsRUFBRTtRQUNULElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztLQUNqQztJQUNELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRTtDQUNyRSxDQUFBO0FBQ0QsTUFBTSxRQUFRLEdBQUc7SUFDZixRQUFRO0lBQ1IsU0FBUztJQUNULFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLFdBQVc7SUFDWCxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixTQUFTO0lBQ1QsY0FBYztDQUNmLENBQUE7QUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFFBQVE7SUFDN0IsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHO1FBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7S0FDL0IsQ0FBQTtBQUVILDRFQUE0RTtBQUM1RSwyRUFBMkU7QUFDM0UsTUFBTSxPQUFPLEdBQTJCO0lBQ3RDLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLE1BQU0sRUFBRSxtRUFBbUU7SUFDM0UsV0FBVyxFQUFFLFVBQVU7SUFDdkIsaUJBQWlCLEVBQUUsV0FBVztJQUM5QixTQUFTLEVBQUUsa0NBQWtDO0lBQzdDLGNBQWMsRUFDWixxRkFBcUY7SUFDdkYsU0FBUyxFQUFFLHVEQUF1RDtJQUNsRSx1QkFBdUIsRUFBRSxTQUFTO0lBQ2xDLGtCQUFrQixFQUFFLGVBQWU7SUFDbkMsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixpQkFBaUIsRUFBRSw4QkFBOEI7SUFDakQsTUFBTSxFQUNKLDRLQUE0SztJQUM5SyxxQkFBcUIsRUFBRSwrQkFBK0I7SUFDdEQsUUFBUSxFQUFFLGtDQUFrQztJQUM1QyxhQUFhLEVBQUUsdUJBQXVCO0lBQ3RDLG9CQUFvQixFQUFFLFVBQVU7SUFDaEMsaUJBQWlCLEVBQUUsUUFBUTtJQUMzQixRQUFRLEVBQ04sNkVBQTZFO0lBQy9FLFVBQVUsRUFDUiw4RUFBOEU7SUFDaEYsT0FBTyxFQUNMLDBGQUEwRjtJQUM1RixnQkFBZ0IsRUFBRSxVQUFVO0lBQzVCLGtCQUFrQixFQUFFLGFBQWE7SUFDakMsaUJBQWlCLEVBQUUsdURBQXVEO0lBQzFFLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFlBQVksRUFBRSxvQ0FBb0M7SUFDbEQsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixLQUFLLEVBQUUsd0NBQXdDO0lBQy9DLE9BQU8sRUFBRSxlQUFlO0NBQ3pCLENBQUE7QUFDRCxNQUFNLFFBQVEsR0FBMkM7SUFDdkQsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7SUFDbkUsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUM3RSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7SUFDOUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUNwQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0lBQzlCLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7SUFDL0IsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0NBQ3hDLENBQUE7QUFDRCxNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQTtBQUMvRSxNQUFNLHFCQUFxQixHQUFHLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQTtBQUV2RSxTQUFTLFNBQVMsQ0FDaEIsT0FBd0IsRUFDeEIsS0FBaUIsRUFDakIsTUFBcUI7SUFFckIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFBO0lBQ2xCLEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFvQyxDQUFBO1lBQzFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN2QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUE7WUFDdEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsSUFBSTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1lBQ3pELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFBO0lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQXFCLENBQUMsR0FBRyxNQUFNLENBQUE7QUFDcEQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUNwQixRQUFnQixFQUNoQixRQUE2RDtJQUU3RCxNQUFNLE9BQU8sR0FBb0IsRUFBRSxDQUFBO0lBQ25DLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ25FLE1BQU0sVUFBVSxHQUFxQztRQUNuRCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1FBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMvQixNQUFNLEVBQUUsSUFBSSxDQUNWLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGFBQWEsQ0FDZDtRQUNELE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQztRQUMvRCxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM3QixTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUU7UUFDdkQsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0tBQzlDLENBQUE7SUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLDRCQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUNqRCxFQUFFLENBQUM7UUFDRixLQUFLLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFVLEVBQ3RCLENBQUMsS0FBSyxDQUFDLEVBQ1AsTUFBTSxFQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FDdkMsQ0FBQTtZQUNGLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRO2lCQUM1QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO2lCQUMvQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsQyxJQUNFLFFBQVEsQ0FBQyxJQUFJLENBQ1gsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDckU7Z0JBRUQsU0FBUTtZQUNWLE1BQU0sT0FBTyxHQUFHLFFBQVE7aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNoQixJQUFJLE9BQU8sS0FBSyxRQUFRO2dCQUFFLFNBQVE7WUFDbEMsSUFBSSxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNoRSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixJQUFJLE1BQU0sS0FBSyxRQUFRO29CQUFFLFNBQVMsR0FBRyxRQUFRLENBQUE7Z0JBQzdDLElBQ0UsUUFBUSxLQUFLLFVBQVU7b0JBQ3ZCLE1BQU0sS0FBSyxNQUFNO29CQUNqQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFFdEIsU0FBUyxHQUFHLFFBQVEsQ0FBQTtZQUN4QixDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FDckIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDM0IsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVztnQkFDdEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDcEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFBO1lBQ3hDLE1BQU0sV0FBVyxHQUNmLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVc7Z0JBQ3RDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQ3BDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQTtZQUN4QyxNQUFNLE1BQU0sR0FBa0I7Z0JBQzVCLFNBQVM7Z0JBQ1QsYUFBYSxFQUNYLFFBQVEsS0FBSyxVQUFVLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxXQUFXLENBQUM7b0JBQzNELENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3BCLENBQUMsQ0FBQyxRQUFRO2FBQ2YsQ0FBQTtZQUNELElBQUksT0FBTyxJQUFJLE1BQU0sS0FBSyxLQUFLO2dCQUM3QixNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDM0IsSUFBQSw4Q0FBMEIsRUFDeEIsT0FBTyxDQUFDLElBQUksRUFDWixNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxDQUNuRSxDQUFBO1lBQ0wsSUFBSSxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4RSxNQUFNLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQTtnQkFDOUIsTUFBTSxDQUFDLGNBQWMsR0FBRztvQkFDdEIsV0FBVyxFQUFFLENBQUMsZUFBZSxDQUFDO29CQUM5QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2lCQUN2QixDQUFBO1lBQ0gsQ0FBQztZQUNELFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTztRQUNMLEdBQUcsRUFBRSxRQUFRO1FBQ2IsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDcEIsT0FBTztRQUNQLFVBQVU7S0FDWCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQXlCO0lBQ2hELE1BQU0sT0FBTyxHQUFvQixFQUFFLENBQUE7SUFDbkMsTUFBTSxVQUFVLEdBQXFDO1FBQ25ELElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUU7UUFDdEQsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO1FBQzVDLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRTtRQUNsRCxNQUFNLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7S0FDOUMsQ0FBQTtJQUNELEtBQUssTUFBTSxLQUFLLElBQUksNEJBQVksQ0FBQyxNQUFNLENBQ3JDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQzdDLEVBQUUsQ0FBQztRQUNGLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQVUsRUFDdEIsQ0FBQyxLQUFLLENBQUMsRUFDUCxNQUFNLEVBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUN2QyxDQUFBO1lBQ0YsTUFBTSxNQUFNLEdBQWtCO2dCQUM1QixTQUFTLEVBQUUsSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVE7YUFDcEUsQ0FBQTtZQUNELElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixNQUFNLElBQUksR0FDUixLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFBO2dCQUN2RSxNQUFNLEtBQUssR0FDVCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXO29CQUN0QyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTO29CQUNwQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQTtnQkFDOUMsSUFDRSxNQUFNLEtBQUssS0FBSztvQkFDaEIsQ0FBQyxDQUNDLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQzt3QkFDdEMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxDQUM5QjtvQkFFRCxTQUFRO2dCQUNWLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxJQUFJO29CQUMzQixNQUFNLENBQUMsSUFBSSxHQUFHO3dCQUNaLFNBQVMsRUFBRSxJQUFJO3dCQUNmLE1BQU0sRUFBRSxxQkFBcUI7d0JBQzdCLGNBQWMsRUFBRSxjQUFjO3FCQUMvQixDQUFBO2dCQUNILElBQUksTUFBTSxLQUFLLFFBQVE7b0JBQ3JCLE1BQU0sQ0FBQyxRQUFRLEdBQUc7d0JBQ2hCLFdBQVcsRUFBRSx5QkFBeUI7d0JBQ3RDLFNBQVMsRUFBRSxJQUFJO3FCQUNoQixDQUFBO2dCQUNILElBQ0UsTUFBTSxLQUFLLEtBQUs7b0JBQ2hCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVM7b0JBQ3BDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksRUFDaEMsQ0FBQztvQkFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQTtvQkFDekIsTUFBTSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUE7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQ0wsTUFBTSxLQUFLLE1BQU07Z0JBQ2pCLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQ3BDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVE7Z0JBRXBDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO1lBQzdCLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQXVCO0lBQ3JDLEdBQUcsRUFBRSxRQUFRO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDcEIsVUFBVSxFQUFFO1FBQ1YsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFO1FBQ2xELEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3pCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtLQUM3QztJQUNELE9BQU8sRUFBRTtRQUNQLFFBQVEsRUFBRTtZQUNSLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNoQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDMUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3BDLEtBQUssRUFBRTtnQkFDTCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQ3pDLElBQUksRUFBRTtvQkFDSixTQUFTLEVBQUUsSUFBSTtvQkFDZixPQUFPLEVBQUU7d0JBQ1AsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7cUJBQzVEO2lCQUNGO2FBQ0Y7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLFNBQVMsRUFBRSxJQUFJO29CQUNmLE9BQU8sRUFBRTt3QkFDUCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtxQkFDNUQ7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sRUFBRTtnQkFDUCxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7Z0JBQzFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7YUFDdEU7WUFDRCxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDekMsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRTtvQkFDSixTQUFTLEVBQUUsWUFBWTtvQkFDdkIsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7d0JBQzFCLElBQUksRUFBRTs0QkFDSixTQUFTLEVBQUUsSUFBSTs0QkFDZixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTt5QkFDeEQ7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7Q0FDRixDQUFBO0FBQ0QsTUFBTSxPQUFPLEdBQXVCO0lBQ2xDLEdBQUcsRUFBRSxTQUFTO0lBQ2QsSUFBSSxFQUFFLFNBQVM7SUFDZixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDcEIsT0FBTyxFQUFFLElBQUEsaUNBQXFCLEVBQUM7UUFDN0IsU0FBUyxFQUFFLE1BQU07UUFDakIsTUFBTSxFQUFFLGVBQWU7UUFDdkIsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixXQUFXLEVBQUUsWUFBWTtLQUMxQixDQUFDO0lBQ0YsVUFBVSxFQUFFO1FBQ1YsSUFBSSxFQUFFLElBQUksRUFBRTtRQUNaLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxFQUFFO1lBQ2YsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1NBQ3REO1FBQ0QsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUU7S0FDckQ7Q0FDRixDQUFBO0FBQ1ksUUFBQSxlQUFlLEdBQWtDLElBQUEsa0NBQWUsRUFDM0U7SUFDRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUNuRCxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUM5QjtJQUNELGVBQWUsQ0FBQyxPQUFPLENBQUM7SUFDeEIsZUFBZSxDQUFDLFNBQVMsQ0FBQztJQUMxQixVQUFVO0lBQ1YsT0FBTztJQUNQLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFzQixFQUFFLENBQUMsQ0FBQztRQUNqRSxHQUFHLEVBQUUsSUFBSTtRQUNULElBQUk7UUFDSixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDcEIsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsRUFBRTtnQkFDZixNQUFNLEVBQUUsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlO2FBQzlEO1NBQ0Y7S0FDRixDQUFDLENBQUM7Q0FDSixDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQixHQUFHLFFBQVE7SUFDWCxpQkFBaUIsRUFBRTtRQUNqQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUN6RCxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRO1lBQzVCLENBQUMsQ0FBQztnQkFDRTtvQkFDRSxPQUFPLEVBQ0wsd0dBQXdHO29CQUMxRyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQy9CO2FBQ0Y7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssaUJBQWlCO1lBQ3JDLENBQUMsQ0FBQztnQkFDRTtvQkFDRSxPQUFPLEVBQ0wsOEZBQThGO29CQUNoRyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUM7aUJBQy9CO2FBQ0Y7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1I7Q0FDRixDQUFDLENBQUMsQ0FDSixDQUFBO0FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSxnQ0FBa0IsRUFBQyw0QkFBWSxDQUFDLENBQUE7QUFDdEQsTUFBTSxvQkFBb0IsR0FBRyx1QkFBZSxDQUFDLElBQUksQ0FDL0MsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUN2QyxDQUFBO0FBQ0YsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLGdDQUFrQixFQUMxQyxJQUFBLDBCQUFjLEVBQUMsb0JBQW9CLENBQUMsQ0FDckMsQ0FBQTtBQUVELFNBQWdCLGNBQWMsQ0FDNUIsTUFBYyxFQUNkLEdBQVcsRUFDWCxJQUFjLEVBQ2QsT0FBZ0I7SUFFaEIsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDN0MsT0FBTyxNQUFNO1lBQ1gsQ0FBQyxDQUFDLElBQUEsNEJBQWdCLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7WUFDL0QsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUNWLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyx1QkFBZSxDQUFDLElBQUksQ0FDbkMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FDM0MsQ0FBQTtJQUNELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFBLDRCQUFnQixFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDM0UsQ0FBQyJ9
@@ -1,4 +1,4 @@
1
- import type { AccessPrincipal } from "./permissions";
1
+ import { type AccessPrincipal } from "./permissions";
2
2
  export declare function permissionKeyMatches(pattern: string, permission: string): boolean;
3
3
  /** Navigation hint only. Request authorization must evaluate trusted server context. */
4
4
  export declare function hasPermissionCandidate(principal: AccessPrincipal, permission: string): boolean;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.permissionKeyMatches = permissionKeyMatches;
4
4
  exports.hasPermissionCandidate = hasPermissionCandidate;
5
+ const permissions_1 = require("./permissions");
5
6
  function permissionKeyMatches(pattern, permission) {
6
7
  return (pattern === permission ||
7
8
  pattern === "*" ||
@@ -10,9 +11,9 @@ function permissionKeyMatches(pattern, permission) {
10
11
  /** Navigation hint only. Request authorization must evaluate trusted server context. */
11
12
  function hasPermissionCandidate(principal, permission) {
12
13
  return (principal.active &&
13
- (principal.is_superuser ||
14
+ ((0, permissions_1.isSuperuser)(principal) ||
14
15
  principal.permissions.includes(permission) ||
15
16
  Boolean(principal.rules?.some((rule) => rule.effect === "allow" &&
16
17
  permissionKeyMatches(rule.permission, permission)))));
17
18
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FjY2Vzcy9wZXJtaXNzaW9uLWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG9EQU1DO0FBR0Qsd0RBZ0JDO0FBekJELFNBQWdCLG9CQUFvQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUN0RSxPQUFPLENBQ0wsT0FBTyxLQUFLLFVBQVU7UUFDdEIsT0FBTyxLQUFLLEdBQUc7UUFDZixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEUsQ0FBQTtBQUNILENBQUM7QUFFRCx3RkFBd0Y7QUFDeEYsU0FBZ0Isc0JBQXNCLENBQ3BDLFNBQTBCLEVBQzFCLFVBQWtCO0lBRWxCLE9BQU8sQ0FDTCxTQUFTLENBQUMsTUFBTTtRQUNoQixDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3JCLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMxQyxPQUFPLENBQ0wsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQ25CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87Z0JBQ3ZCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQ3BELENBQ0YsQ0FBQyxDQUNMLENBQUE7QUFDSCxDQUFDIn0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FjY2Vzcy9wZXJtaXNzaW9uLWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLG9EQU1DO0FBR0Qsd0RBZ0JDO0FBM0JELCtDQUFpRTtBQUVqRSxTQUFnQixvQkFBb0IsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDdEUsT0FBTyxDQUNMLE9BQU8sS0FBSyxVQUFVO1FBQ3RCLE9BQU8sS0FBSyxHQUFHO1FBQ2YsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3hFLENBQUE7QUFDSCxDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLFNBQWdCLHNCQUFzQixDQUNwQyxTQUEwQixFQUMxQixVQUFrQjtJQUVsQixPQUFPLENBQ0wsU0FBUyxDQUFDLE1BQU07UUFDaEIsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsU0FBUyxDQUFDO1lBQ3JCLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMxQyxPQUFPLENBQ0wsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQ25CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU87Z0JBQ3ZCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQ3BELENBQ0YsQ0FBQyxDQUNMLENBQUE7QUFDSCxDQUFDIn0=
@@ -12,3 +12,10 @@ export type AccessPrincipal = {
12
12
  permissions: Permission[];
13
13
  rules?: PermissionRule[];
14
14
  };
15
+ /** Elevated authority applies only to an active native staff principal. */
16
+ export declare function isSuperuser(principal: AccessPrincipal): boolean;
17
+ export declare const SUPERUSER_AUTHORITY: Readonly<{
18
+ scope: "all_admin_operations";
19
+ description: "An active native staff account with the Superuser role can access all registered Admin pages and operations, including publishable API keys, secret API keys, workflows and plugin routes without a permission mapping. All permissions below are included, along with future permissions. Native authentication, validation and account safety protections still apply.";
20
+ }>;
21
+ export type SuperuserAuthority = typeof SUPERUSER_AUTHORITY;
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PERMISSION_IDS = exports.PERMISSIONS = void 0;
3
+ exports.SUPERUSER_AUTHORITY = exports.PERMISSION_IDS = exports.PERMISSIONS = void 0;
4
4
  exports.validatePermissions = validatePermissions;
5
+ exports.isSuperuser = isSuperuser;
5
6
  exports.PERMISSIONS = [
6
7
  ["staff.view", "View staff", "Access"],
7
8
  ["roles.view", "View roles", "Access"],
@@ -47,4 +48,16 @@ function validatePermissions(values, ids = exports.PERMISSION_IDS) {
47
48
  }
48
49
  return [...new Set(values)];
49
50
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FjY2Vzcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEyQ0Esa0RBY0M7QUF4RFksUUFBQSxXQUFXLEdBQUc7SUFDekIsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQztJQUN0QyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO0lBQ3RDLENBQUMsWUFBWSxFQUFFLDJCQUEyQixFQUFFLFFBQVEsQ0FBQztJQUNyRCxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxTQUFTLENBQUM7SUFDMUQsQ0FBQyxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLENBQUM7SUFDdkQsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQztJQUM3QyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUNuRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUNqRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUNqRCxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUNqRCxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDO0lBQ3pDLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUM7SUFDM0MsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLENBQUM7SUFDakQsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLENBQUM7SUFDckQsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLENBQUM7SUFDbkQsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLENBQUM7SUFDdkQsQ0FBQyx3QkFBd0IsRUFBRSxnQ0FBZ0MsRUFBRSxTQUFTLENBQUM7SUFDdkUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDO0lBQzdDLENBQUMsZ0JBQWdCLEVBQUUsNkJBQTZCLEVBQUUsV0FBVyxDQUFDO0lBQzlELENBQUMsa0JBQWtCLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxDQUFDO0lBQ2xFLENBQUMsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxDQUFDO0lBQzdELENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxDQUFDO0lBQ2pFLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUM7SUFDeEMsQ0FBQyxlQUFlLEVBQUUsdUNBQXVDLEVBQUUsUUFBUSxDQUFDO0lBQ3BFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUM7SUFDNUMsQ0FBQyxnQkFBZ0IsRUFBRSw4QkFBOEIsRUFBRSxXQUFXLENBQUM7SUFDL0QsQ0FBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUM7SUFDckQsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQztJQUM3QyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUNuRCxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO0lBQzdDLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxDQUFDO0lBQ25ELENBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO0lBQ3ZELENBQUMsZUFBZSxFQUFFLHdCQUF3QixFQUFFLFVBQVUsQ0FBQztJQUN2RCxDQUFDLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLFVBQVUsQ0FBQztDQUNuRCxDQUFBO0FBR0csUUFBQSxjQUFjLEdBQTBCLG1CQUFXLENBQUMsR0FBRyxDQUNsRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FDYixDQUFBO0FBRUQsU0FBZ0IsbUJBQW1CLENBQ2pDLE1BQWUsRUFDZixNQUF5QixzQkFBYztJQUV2QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMxQixJQUNFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMxRCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsQ0FDakUsQ0FBQTtJQUNILENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBaUIsQ0FBQTtBQUM3QyxDQUFDIn0=
51
+ /** Elevated authority applies only to an active native staff principal. */
52
+ function isSuperuser(principal) {
53
+ return (principal.actor_type === "user" &&
54
+ principal.active &&
55
+ principal.is_superuser);
56
+ }
57
+ // Describes authority beyond the finite permission catalog without inventing
58
+ // grant identifiers for native routes that ordinary roles cannot access.
59
+ exports.SUPERUSER_AUTHORITY = Object.freeze({
60
+ scope: "all_admin_operations",
61
+ description: "An active native staff account with the Superuser role can access all registered Admin pages and operations, including publishable API keys, secret API keys, workflows and plugin routes without a permission mapping. All permissions below are included, along with future permissions. Native authentication, validation and account safety protections still apply.",
62
+ });
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2FjY2Vzcy9wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEyQ0Esa0RBY0M7QUFhRCxrQ0FNQztBQTNFWSxRQUFBLFdBQVcsR0FBRztJQUN6QixDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDO0lBQ3RDLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUM7SUFDdEMsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLEVBQUUsUUFBUSxDQUFDO0lBQ3JELENBQUMsZUFBZSxFQUFFLDRCQUE0QixFQUFFLFNBQVMsQ0FBQztJQUMxRCxDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsQ0FBQztJQUN2RCxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDO0lBQzdDLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQ25ELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQ2pELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQ2pELENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO0lBQ2pELENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUM7SUFDekMsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQztJQUMzQyxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQztJQUNqRCxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLFNBQVMsQ0FBQztJQUNyRCxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUNuRCxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLFNBQVMsQ0FBQztJQUN2RCxDQUFDLHdCQUF3QixFQUFF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
@@ -1,13 +1,22 @@
1
1
  import { type PermissionContext } from "./config";
2
- import type { Permission, AccessPrincipal } from "./permissions";
2
+ import { type Permission, type AccessPrincipal } from "./permissions";
3
+ export { additionalWritePermissions } from "./write-permissions";
3
4
  export type Policy = {
4
5
  permissions: Permission[];
5
6
  superuser?: boolean;
6
7
  };
7
8
  export declare function normalizedPath(url: string): string | null;
9
+ /** Structural inspection; request body, scope and payload grants require resolveRequest. */
8
10
  export declare function policyFor(method: string, path: string): Policy | null;
9
11
  export declare function isBootstrapRead(method: string, path: string): boolean;
10
12
  export declare function isSelfProfileUpdate(method: string, path: string, userId: string, body: unknown): boolean;
11
13
  export declare function can(principal: AccessPrincipal, policy: Policy, context?: PermissionContext): boolean;
12
- export declare function validateFieldSelection(resource: string, fields: unknown): boolean;
13
- export declare function additionalWritePermissions(value: unknown, creating?: boolean): Permission[];
14
+ /** Dashboard's group picker only reads member IDs to disable existing choices. */
15
+ export declare function nativeFieldSelection<T>(resource: string, fields: T): T | string;
16
+ /** Native promotion rule picker hydrates a selected sales channel by ID. */
17
+ export declare function nativePromotionRuleValue(resource: string, params: Record<string, string>, query: {
18
+ id?: unknown;
19
+ value?: unknown;
20
+ limit?: unknown;
21
+ }): string | undefined;
22
+ export declare function validateFieldSelection(resource: string, fields: unknown, override?: readonly string[]): boolean;