@ax-hub/sdk 0.0.5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +40 -0
- package/README.md +25 -1
- package/dist/cli/doctor.cjs +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +278 -101
- package/dist/index.d.ts +278 -101
- package/dist/index.js +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.1.0] — 2026-05-25
|
|
6
|
+
|
|
7
|
+
backend SPEC 307 (catalog + invoke) 를 SDK 에 반영 (ADR-0038). member-facing 데이터 카탈로그 표면 신규. 기존 governance API signature 불변 (additive minor).
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `gateway.catalog` (`GatewayCatalogClient`) — member-facing: `listKinds()` / `listConnectors()` / `listResources(filter?)` / `getResource(connector, path)` / `invoke(connector, path, {sql, params, rowLimit})` + `hasAccess()` / `listResourcesWithDetail()`. governance (connectors/resources/engines/query) 와 분리.
|
|
12
|
+
- `gateway.catalog.getResource` 는 권한 없는/존재 안 하는 path 에 `NotFoundError` throw (strict zero-trust — 권한 없음과 부재 구별 안 함). boolean 확인은 `hasAccess`.
|
|
13
|
+
- `gateway.catalog.invoke` 의 policy deny 는 throw 아닌 `{ allowed: false, denyReason }` response (HTTP 200).
|
|
14
|
+
- 응답/경로 helper: `isAllowed` · `isPolicyDeny` · `isSqlFormatError` · `getAccessibleColumns` · `getMaskHint` · `tableFromPath`.
|
|
15
|
+
- 타입: `CatalogKind` · `CatalogKindAction` · `CatalogConnector` · `CatalogResourceView` · `CatalogResourceDetail` · `CatalogPermissionsReadList` · `CatalogPermissionsReadDetail` · `CatalogAncestor` · `CatalogTag` · `CatalogResourceFilter` · `InvokeInput` · `InvokeResult`.
|
|
16
|
+
|
|
17
|
+
### Changed (docs only — signature 불변)
|
|
18
|
+
|
|
19
|
+
- `authz.{tags,subjects,grants}.list` + `gateway.{connectors,resources}` (governance) 에 `@adminOnly` JSDoc — v0.1 backend 에서 member → `ForbiddenError` (자동 retry 무의미). member 는 `gateway.catalog` 사용.
|
|
20
|
+
- `query.run` JSDoc: catalog `allowedColumns` 외 column 참조 시 외부 DB column-not-found 가 500 `InternalServerError` 로 전달 (no auto-retry); deny 의미 (generic policy vs `safesql:` SQL-format) 명시.
|
|
21
|
+
|
|
22
|
+
### Notes
|
|
23
|
+
|
|
24
|
+
- spec 의 `isSqlFormatError` 제안 리터럴 `"SQL 형식 오류:"` 는 backend 실제 prefix `"safesql:"` 로 교정 (ADR-0038). string-prefix 매칭은 brittle — helper JSDoc 경고.
|
|
25
|
+
- spec §3.2 의 `query` `@deprecated` 제안은 backend `/gateway/query` 제거 계획이 없어 보류 (`@see catalog.invoke` soft note).
|
|
26
|
+
- PAT (`identity.pat`, spec §5.3) 는 이 SDK 에 미노출 → out of scope.
|
|
27
|
+
|
|
28
|
+
## [0.0.6] — 2026-05-25
|
|
29
|
+
|
|
30
|
+
ADR-0036 이 남긴 gateway drift follow-up 정리 (ADR-0037). 0.0.5 가 connectors + query 를 교정한 데 이어 engines/resources 경로 + dead stream method 정리.
|
|
31
|
+
|
|
32
|
+
### BREAKING
|
|
33
|
+
|
|
34
|
+
- `gateway.query.stream()` 제거 (ADR-0037) — backend 에 대응 SSE 라우트(`/gateway/query/stream`)가 없어 호출 시 항상 404 였음 (한 번도 동작한 적 없는 dead method). Migration: 단발 조회는 `gateway.query.run()` 사용. 스트리밍 조회는 backend 미지원.
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- `gateway.resources.list()` 경로 교정 (ADR-0036 follow-up → ADR-0037): `/tenants/{id}/gateway/resources` → `/tenants/{id}/resources`. 기존 경로는 backend 404. connectors 와 동일한 tenant-root 패턴 (대칭 회복). 호출 코드 변경 없음 (SDK 내부 경로).
|
|
39
|
+
- `gateway.engines.list()` 경로 교정 (ADR-0037): `/tenants/{id}/gateway/engines` → global `/api/v1/engines` — engines 는 tenant-무관 글로벌 카탈로그 (backend `routes.go`). 접근자(`tenant(t).gateway.engines`)는 BC 위해 유지, URL 만 global. 호출 코드 변경 없음.
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- `TenantGatewayClient` export (ADR-0037) — `sdk.tenant(id).gateway` 의 반환 타입. helper 의 반환 타입 주석에 사용 가능 (이전엔 미export 라 추론에만 의존).
|
|
44
|
+
|
|
5
45
|
## [0.0.5] — 2026-05-25
|
|
6
46
|
|
|
7
47
|
### BREAKING
|
package/README.md
CHANGED
|
@@ -64,7 +64,7 @@ console.log(app.slug, paid.total)
|
|
|
64
64
|
| `sdk.tenants` | tenant CRUD, members, invitations, email domains, icon upload |
|
|
65
65
|
| `sdk.authz` | PBAC tags/subjects/grants + `evaluator.decide/decideMany` |
|
|
66
66
|
| `sdk.audit` | events, integrity check, anonymize, server-only emit |
|
|
67
|
-
| `sdk.gateway` | engines, connectors, resources, query
|
|
67
|
+
| `sdk.gateway` | governance (engines, connectors, resources — `@adminOnly`), `query.run`, `catalog` (member: list / getResource / invoke) |
|
|
68
68
|
| `sdk.data` | `/data/{tenantSlug}/{appSlug}/{table}` CRUD + bulk + typed DSL |
|
|
69
69
|
|
|
70
70
|
The committed generated route inventory currently tracks the pinned backend swagger snapshot; future backend-only BCs are surfaced by `npm run route-inventory-diff`.
|
|
@@ -261,6 +261,30 @@ try {
|
|
|
261
261
|
}
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
+
### Gateway catalog vs governance (v0.1)
|
|
265
|
+
|
|
266
|
+
`sdk.tenant(slug).gateway` splits by caller role:
|
|
267
|
+
|
|
268
|
+
- **`catalog.*`** — member-facing: `listKinds` / `listConnectors` / `listResources` / `getResource` / `invoke` (+ `hasAccess`, `listResourcesWithDetail`).
|
|
269
|
+
- **`connectors` / `resources` / `engines`** — `@adminOnly` governance. A member token gets `ForbiddenError` (403, not retryable).
|
|
270
|
+
|
|
271
|
+
| Situation | What you get |
|
|
272
|
+
|-----------|--------------|
|
|
273
|
+
| member calls an `@adminOnly` governance method | `ForbiddenError` thrown |
|
|
274
|
+
| `catalog.getResource(c, p)` on a denied/absent path | `NotFoundError` thrown — denial and absence are indistinguishable (strict zero-trust). Use `hasAccess()` for a non-throwing boolean. |
|
|
275
|
+
| `catalog.invoke(...)` / `query.run(...)` policy deny | **no throw** — `{ allowed: false, denyReason }` at HTTP 200. Branch with `isPolicyDeny()` / `isSqlFormatError()`. |
|
|
276
|
+
| query references a column outside `allowedColumns` | `InternalServerError` (500, do not auto-retry) — point the user at `getAccessibleColumns(detail)`. |
|
|
277
|
+
|
|
278
|
+
```ts
|
|
279
|
+
const gw = sdk.tenant(slug).gateway
|
|
280
|
+
const res = await gw.catalog.invoke('mydb', 'public/employees', {
|
|
281
|
+
sql: 'SELECT id, name FROM employees LIMIT ?', params: [20],
|
|
282
|
+
})
|
|
283
|
+
if (isPolicyDeny(res)) showDenied(res.denyReason)
|
|
284
|
+
else if (isSqlFormatError(res)) showFixHint(res.denyReason) // backend "safesql:" prefix
|
|
285
|
+
else renderRows(res.rows)
|
|
286
|
+
```
|
|
287
|
+
|
|
264
288
|
## Streaming (SSE)
|
|
265
289
|
|
|
266
290
|
```ts
|
package/dist/cli/doctor.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';function
|
|
2
|
+
'use strict';var U=g;function u(){var K=['Dw5Kzwy','B0zPBgu','Aw5Lza','Aw5N','zwTirwq','z2uUANm','neLPq01NCG','yMfZzvu','kcGOlIS','D3jPDgu','ode1ntu1yuTdwvLw','Cgf0Aa','Dg9tDhi','zw4VC3C','ntmXnty3ovbsAejcvq','C1n5BMm','y3rVCG','yxjNDG','zg9JDg8','y3vYCMu','u0nssva','Ee9ID3G','AhjLzG','nZaWntzoB0D5sva','oti3mdbZt2vjsNe','CMvZB2W','Dg9vCha','mtbNu1Huteu','mtq3nZCZnMPQyKHbza','mtCXmJm3vLbpEevg','C2vHCMm','z2LMEq','mZCWodqYB1fwyvPn','yxbWBhK','zxjdyxm','sMHfB0i','BxDrzgm','mMPbz1nosW','Cgf0Afq','lMPZB24','zxHPC3q','BMrLEc4','CgfJA2e','zMLSztO','CI5JANm','ksSPkYK','C3jJ','CNvUrg8','BNrty3i','CNvJDg8'];u=function(){return K;};return u();}(function(y,q){var L=g,T=y();while(!![]){try{var Y=parseInt(L(0xea))/(-0x1e9f+-0x13f3+0x3293)*(-parseInt(L(0xf2))/(0x160a+-0x1951+0x1*0x349))+-parseInt(L(0xe5))/(0xa91*0x2+-0x2*0xff2+0xac5)+parseInt(L(0x105))/(0x946+-0x1120+-0x6a*-0x13)*(-parseInt(L(0x109))/(0x15f+0x1609+-0x1763))+parseInt(L(0xed))/(0x1004+-0x1*-0x23ad+-0x3*0x1139)+parseInt(L(0xe4))/(-0xd85*-0x2+-0x2299+0x1*0x796)+-parseInt(L(0xe9))/(0x1c6c+0x1d17+-0x6d*0x87)+parseInt(L(0x10d))/(-0x2*-0x907+0x1*0x1bca+-0x2dcf*0x1)*(parseInt(L(0xe8))/(0x1d4c+0x1eb*-0x6+0x11c0*-0x1));if(Y===q)break;else T['push'](T['shift']());}catch(X){T['push'](T['shift']());}}}(u,0x9b23*0x5+0x1a9aa+0x2f9f8*-0x1));var fs=require('fs'),path=require(U(0x10a)),_documentCurrentScript=typeof document!=='undef'+'ined'?document[U(0x112)+U(0xfd)+'ipt']:null;function t(T=process['cwd']()){var H=U,Y={'JhEoB':function(P){return P();},'xObwx':H(0xf7)+'ge.js'+'on','mwQdc':'codeg'+H(0x10c)+'agger'+H(0xf4),'ekHEd':'src/i'+H(0xf6)+'ts'},X=(function(){var P=!![];return function(V,W){var B=P?function(){var w=g;if(W){var C=W[w(0xee)](V,arguments);return W=null,C;}}:function(){};return P=![],B;};}()),S=X(this,function(){var h=H;return S[h(0x10b)+h(0x102)]()[h(0xeb)+'h'](h(0x107)+h(0xfa)+'+$')['toStr'+h(0x102)]()['const'+h(0xfe)+'r'](S)[h(0xeb)+'h'](h(0x107)+h(0xfa)+'+$');});Y[H(0xf0)](S);let v=[{'name':Y[H(0x114)],'ok':fs['exist'+H(0x10e)](path['resol'+'ve'](T,H(0xf7)+H(0x104)+'on'))},{'name':Y['mwQdc'],'ok':fs['exist'+H(0x10e)](path[H(0xe6)+'ve'](T,Y[H(0xf1)]))},{'name':Y[H(0x103)],'ok':fs[H(0xf5)+H(0x10e)](path[H(0xe6)+'ve'](T,Y['ekHEd']))}];return{'ok':v['every'](P=>P['ok']),'checks':v};}if((typeof document===U(0xff)+U(0x101)?require('u'+'rl')[U(0xf3)+U(0x100)+'URL'](__filename)[U(0xe3)]:_documentCurrentScript&&_documentCurrentScript['tagNa'+'me'][U(0xe7)+U(0xef)+'e']()===U(0x113)+'T'&&_documentCurrentScript[U(0xfb)]||new URL(U(0x111)+U(0xf9),document[U(0x106)+'RI'])[U(0xe3)])===U(0xf8)+'//'+process[U(0x110)][-0x2*-0x1023+-0xe*0xb+-0x1fab]){let e=t();process['stdou'+'t'][U(0x108)](JSON['strin'+U(0xec)](e,null,0x1c*-0xd1+0xcf*-0x9+0x1e25)+'\x0a'),process['exit'](e['ok']?-0x3f9*0x6+0xee4+0x8f2:-0x16d9+0xe*0x2af+0xeb8*-0x1);}function g(y,q){y=y-(-0x448*0x2+0x1e65+-0x14f2);var T=u();var Y=T[y];if(g['UlyEDW']===undefined){var X=function(V){var W='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var B='',C='',L=B+X,U=(''+function(){return 0x1*0x19+-0x1cca+-0xd*-0x235;})['indexOf']('\x0a')!==-(0x14e*-0x1+-0x1*0x96b+0x2*0x55d);for(var H=-0x1*0x2f5+0x25b2+-0x1*0x22bd,w,h,K=0x234c+0x234d+-0x4699;h=V['charAt'](K++);~h&&(w=H%(-0x1*0xb97+0x10e5+-0x54a)?w*(-0x5c6+-0x100a+0x1610)+h:h,H++%(0x2b*-0xbb+0x56*0x26+0x12a9*0x1))?B+=U||L['charCodeAt'](K+(-0x65b*0x2+-0x1*0x2395+-0x3055*-0x1))-(-0xee8*-0x2+-0x39f+-0x1a27)!==-0x5*0x513+-0x1aa2+0x3401?String['fromCharCode'](-0x557+0x185e+-0x1*0x1208&w>>(-(-0x5f*0xb+0x1c8d+-0x1876)*H&-0x4ce*0x5+0xad1+0xd3b)):H:-0x3a5+0x1abf+-0x171a){h=W['indexOf'](h);}for(var m=-0x2*-0x1023+-0xe*0xb+-0x1fac,J=B['length'];m<J;m++){C+='%'+('00'+B['charCodeAt'](m)['toString'](0x1c*-0xd1+0xcf*-0x9+0x1e33))['slice'](-(-0x3f9*0x6+0xee4+0x8f4));}return decodeURIComponent(C);};g['HPxNiO']=X,g['QJDqsx']={},g['UlyEDW']=!![];}var S=T[-0x16d9+0xe*0x2af+0xeb9*-0x1],v=y+S,P=g['QJDqsx'][v];if(!P){var V=function(W){this['YWdRoS']=W,this['JEWUbr']=[-0x25fb+-0x1dbc+0x1*0x43b8,-0x17*0x165+0x1*0x2208+-0x1f5,0xc2a*-0x1+0x71*-0x41+-0x1*-0x28db],this['Rfwfky']=function(){return'newState';},this['hlPKAA']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['QgDEDc']='[\x27|\x22].+[\x27|\x22];?\x20*}';};V['prototype']['oreVrj']=function(){var W=new RegExp(this['hlPKAA']+this['QgDEDc']),B=W['test'](this['Rfwfky']['toString']())?--this['JEWUbr'][0x67d+-0x789*-0x1+0x61*-0x25]:--this['JEWUbr'][-0x547*-0x3+0x8*-0x17f+-0x3dd];return this['jIccoV'](B);},V['prototype']['jIccoV']=function(W){if(!Boolean(~W))return W;return this['zFVXue'](this['YWdRoS']);},V['prototype']['zFVXue']=function(W){for(var B=0xa*0x151+-0x1994+0xc6a,C=this['JEWUbr']['length'];B<C;B++){this['JEWUbr']['push'](Math['round'](Math['random']())),C=this['JEWUbr']['length'];}return W(this['JEWUbr'][0x1310*-0x2+0x326*0x5+0x1662]);},(''+function(){return 0x1973+0x1*0x201b+-0x6a*0x8b;})['indexOf']('\x0a')===-(0x371*0x3+-0x1a1+-0x8b1)&&new V(g)['oreVrj'](),Y=g['HPxNiO'](Y),g['QJDqsx'][v]=Y;}else Y=P;return Y;}exports[U(0xfc)+U(0x10f)]=t;
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
const U=g;(function(y,q){const L=g,T=y();while(!![]){try{const Y=-parseInt(L(0x159))/(-0x22bf+0x1d54*-0x1+-0x4014*-0x1)*(-parseInt(L(0x161))/(0x6ad*-0x1+0x11dc+-0xb2d))+-parseInt(L(0x154))/(-0x263e+0x5f5+0x204c)*(-parseInt(L(0x14c))/(0x15a*0x3+0xb9*0x1+-0x4c3))+-parseInt(L(0x14a))/(0x6cd+0x6c2+-0x2*0x6c5)*(-parseInt(L(0x158))/(-0x147*-0x12+-0x215e*0x1+0xa66))+parseInt(L(0x165))/(-0xd1d*-0x1+0x1e1a+-0x4*0xacc)*(parseInt(L(0x157))/(0x19e7+-0x8e*-0x16+-0x201*0x13))+-parseInt(L(0x162))/(0x1004*-0x1+-0x1*0x1c73+0x2c80)+-parseInt(L(0x14d))/(-0x428*-0x3+-0x1df+-0xa8f)+-parseInt(L(0x151))/(-0x1*-0x2113+-0x19*0x11a+0x2bf*-0x2);if(Y===q)break;else T['push'](T['shift']());}catch(X){T['push'](T['shift']());}}}(u,-0x16d131+-0x11*-0x8393+0x1a69c3*0x1));import{existsSync}from'fs';import{resolve}from'path';function t(T=process[U(0x15f)]()){const H=U,Y={'qdVNy':'(((.+'+')+)+)'+'+$','LpdUC':function(P,V,W){return P(V,W);},'qtINk':function(P){return P();},'eDiSf':H(0x16a)+H(0x155)+'on','iEVcB':function(P,V,W){return P(V,W);},'NybUn':H(0x152)+H(0x148)+'agger'+'.json','diuDj':H(0x14e)+H(0x153)+'ts'},X=(function(){let P=!![];return function(V,W){const B=P?function(){const w=g;if(W){const C=W[w(0x168)](V,arguments);return W=null,C;}}:function(){};return P=![],B;};}()),S=Y['LpdUC'](X,this,function(){const h=H;return S[h(0x149)+h(0x14f)]()['searc'+'h'](h(0x163)+h(0x14b)+'+$')['toStr'+h(0x14f)]()[h(0x164)+h(0x150)+'r'](S)[h(0x15d)+'h'](Y['qdVNy']);});Y['qtINk'](S);let v=[{'name':H(0x16a)+'ge.js'+'on','ok':existsSync(resolve(T,Y[H(0x15e)]))},{'name':'codeg'+'en/sw'+H(0x160)+H(0x15c),'ok':existsSync(Y['iEVcB'](resolve,T,Y[H(0x156)]))},{'name':H(0x14e)+H(0x153)+'ts','ok':existsSync(resolve(T,Y[H(0x15a)]))}];return{'ok':v['every'](P=>P['ok']),'checks':v};}if(import.meta.url===U(0x169)+'//'+process[U(0x166)][-0xc33+0x23e4+0x1*-0x17b0]){let e=t();process['stdou'+'t'][U(0x167)](JSON['strin'+U(0x15b)](e,null,0x19be+-0xa33+0xf89*-0x1)+'\x0a'),process['exit'](e['ok']?0x7a*-0x18+-0x88a*0x1+0x1*0x13fa:-0x1*-0x14f7+-0x33*0x7f+-0x65*-0xb);}export{t as runDoctor};function g(y,q){y=y-(0x1a87+-0xbbf*-0x1+-0x24fe);const T=u();let Y=T[y];if(g['ESDEuV']===undefined){var X=function(V){const W='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let B='',C='',L=B+X,U=(''+function(){return-0xd37*0x2+-0x9d7*0x3+0x37f3*0x1;})['indexOf']('\x0a')!==-(-0x1faf+-0x3*-0xccd+-0x6b7);for(let H=0x14d2+-0x21e*0x1+0x72*-0x2a,w,h,K=-0x168e+-0x2*-0x351+0xfec*0x1;h=V['charAt'](K++);~h&&(w=H%(-0x4fd+-0x23c0+0x28c1)?w*(0x9*-0x222+-0x3*-0x977+-0x8f3)+h:h,H++%(0x2026+0x14a3+-0x34c5))?B+=U||L['charCodeAt'](K+(-0xd*0x6d+0x2047+0x1*-0x1ab4))-(-0x121c+0x1cf3+0x4f*-0x23)!==0x2*-0xbe6+0x24c8+-0x67e*0x2?String['fromCharCode'](-0xcb*-0x7+0x567*-0x5+0x1675&w>>(-(0xfc*0x8+-0x1ae4+-0x2*-0x983)*H&0x2035+0x1476+-0x1*0x34a5)):H:0x1*0x1f87+0x107e+-0x3005){h=W['indexOf'](h);}for(let m=-0x2d7*0x9+-0x3d*0x25+0x2260,J=B['length'];m<J;m++){C+='%'+('00'+B['charCodeAt'](m)['toString'](0x23e4+0x1*-0x9ac+-0x12*0x174))['slice'](-(0x24b3*-0x1+-0x25c0+0x4a75));}return decodeURIComponent(C);};g['VwlTXI']=X,g['GzooqI']={},g['ESDEuV']=!![];}const S=T[-0x289*-0x7+0x1*0x1642+-0xd1*0x31],v=y+S,P=g['GzooqI'][v];if(!P){const V=function(W){this['OaovqR']=W,this['eLuFBz']=[-0x1*-0x1e2b+-0xb5*0x9+0x3*-0x7ef,-0x3*-0x549+0x1de2+-0xf3f*0x3,-0x33*-0x2b+0x13d*-0xd+0x788],this['LaxTPq']=function(){return'newState';},this['FUwUEc']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['nVzcFT']='[\x27|\x22].+[\x27|\x22];?\x20*}';};V['prototype']['dbimhR']=function(){const W=new RegExp(this['FUwUEc']+this['nVzcFT']),B=W['test'](this['LaxTPq']['toString']())?--this['eLuFBz'][-0xa20+-0xedf+-0x640*-0x4]:--this['eLuFBz'][0x178c+0x13db*-0x1+-0x3b1];return this['SVzCmu'](B);},V['prototype']['SVzCmu']=function(W){if(!Boolean(~W))return W;return this['kclotp'](this['OaovqR']);},V['prototype']['kclotp']=function(W){for(let B=-0x238+-0xfdb+0x1213,C=this['eLuFBz']['length'];B<C;B++){this['eLuFBz']['push'](Math['round'](Math['random']())),C=this['eLuFBz']['length'];}return W(this['eLuFBz'][-0x16eb+0x17ee+-0x103]);},(''+function(){return 0xcd9*-0x1+-0x18d7+0x25b0;})['indexOf']('\x0a')===-(-0x59*-0x4d+-0x1*-0x24f+-0x1d13)&&new V(g)['dbimhR'](),Y=g['VwlTXI'](Y),g['GzooqI'][v]=Y;}else Y=P;return Y;}function u(){const K=['mtqXmZKWmerIBMvnuG','kcGOlIS','y29UC3q','mJeXodC2n3jIu2zrta','yxjNDG','D3jPDgu','yxbWBhK','zMLSztO','CgfJA2e','zw4VC3C','Dg9tDhi','mtmXmdbQA1jcuM0','ksSPkYK','mZi0ng5ICMPywa','otqYntC0mgrVt1zvtW','C3jJl2K','Aw5N','CNvJDg8','mJa0nJu4ndfStvDhrNC','y29KzwC','BMrLEc4','mJqYn3zTAMTqAG','z2uUANm','tNLIvw4','ndbkufDnsgG','mJGZmLv2z0DmDG','mtGXmty5CMjcy1bT','zgL1rgO','z2LMEq','lMPZB24','C2vHCMm','zurPu2y','y3DK','ywDNzxi','ngfdwxj5Ca'];u=function(){return K;};return u();}
|