var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import { AclManagementClient } from './AclManagementClient'; import { RolesManagementClient } from './RolesManagementClient'; import { AgreementManagementClient } from './AgreementManagementClient'; /** * @class ApplicationsManagementClient 管理分组 * @description 此模块用于管理 Authing 分组,可以进行分组的增删改查、分组添加/删除用户、分组添加/删除策略 等操作。 * * @example * * 请使用以下方式使用该模块,而不要直接初始化该模块: * \`\`\`javascript * import { ManagementClient } from "authing-js-sdk" * const managementClient = new ManagementClient({ * userPoolId: "YOUR_USERPOOL_ID", * secret: "YOUR_USERPOOL_SECRET", * }) * managementClient.applications.list // 获取应用列表 * managementClient.applications.findById // 通过 ID 获取应用详情 * \`\`\` * * @name ApplicationsManagementClient */ var ApplicationsManagementClient = /** @class */ (function () { function ApplicationsManagementClient(options, httpClient, graphqlClient, tokenProvider) { this.options = options; this.httpClient = httpClient; this.graphqlClient = graphqlClient; this.tokenProvider = tokenProvider; this.acl = new AclManagementClient(options, graphqlClient, httpClient, tokenProvider); this.roles = new RolesManagementClient(options, graphqlClient, tokenProvider); this.agreements = new AgreementManagementClient(options, graphqlClient, httpClient, tokenProvider); } /** * @description 获取用户池应用列表 * */ ApplicationsManagementClient.prototype.list = function (params) { return __awaiter(this, void 0, void 0, function () { var _a, _b, page, _c, limit, data; return __generator(this, function (_d) { switch (_d.label) { case 0: _a = params || {}, _b = _a.page, page = _b === void 0 ? 1 : _b, _c = _a.limit, limit = _c === void 0 ? 10 : _c; return [4 /*yield*/, this.httpClient.request({ url: this.options.host + "/api/v2/applications", method: 'GET', params: { page: page, limit: limit } })]; case 1: data = _d.sent(); return [2 /*return*/, data]; } }); }); }; /** * 创建应用 * @param options.name 应用名称 * @param options.identifier 应用认证地址 * @param options.redirectUris 应用回调链接 * @param options.logo 应用 logo * @returns Promise */ ApplicationsManagementClient.prototype.create = function (options) { return __awaiter(this, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.httpClient.request({ method: 'POST', url: this.options.host + "/api/v2/applications", data: __assign({}, options) })]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; /** * 删除应用 * @param appId 应用 ID * @returns Promise */ ApplicationsManagementClient.prototype.delete = function (appId) { return __awaiter(this, void 0, void 0, function () { var error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this.httpClient.request({ method: 'DELETE', url: this.options.host + "/api/v2/applications/" + appId })]; case 1: _a.sent(); return [2 /*return*/, true]; case 2: error_1 = _a.sent(); throw error_1; case 3: return [2 /*return*/]; } }); }); }; /** * @description 通过 ID 获取应用详情 * @param id 应用 ID */ ApplicationsManagementClient.prototype.findById = function (id) { return __awaiter(this, void 0, void 0, function () { var data; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!id) { throw new Error('params id is required!'); } return [4 /*yield*/, this.httpClient.request({ url: this.options.host + "/api/v2/applications/" + id, method: 'GET' })]; case 1: data = _a.sent(); return [2 /*return*/, data]; } }); }); }; ApplicationsManagementClient.prototype.listResources = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.getResources(__assign(__assign({}, options), { namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.createResource = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.createResource(__assign(__assign({}, options), { namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.updateResource = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.updateResource(options.code, __assign(__assign({}, options), { namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.deleteResource = function (appId, code) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.deleteResource(code, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 获取应用访问控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.getAccessPolicies = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.getApplicationAccessPolicies(__assign(__assign({}, options), { appId: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 启用针对某个用户、角色、分组、组织机构的应用访问控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.enableAccessPolicy = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.enableApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 停用针对某个用户、角色、分组、组织机构的应用访问控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.disableAccessPolicy = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.disableApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 删除针对某个用户、角色、分组、组织机构的应用访问控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.deleteAccessPolicy = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.deleteApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 配置「允许主体(用户、角色、分组、组织机构节点)访问应用」的控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.allowAccess = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.allowAccessApplication(__assign(__assign({}, options), { appId: appId, namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 配置「拒绝主体(用户、角色、分组、组织机构节点)访问应用」的控制策略 * @param appId * @param options */ ApplicationsManagementClient.prototype.denyAccess = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.denyAccessApplication(__assign(__assign({}, options), { appId: appId, namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @description 更改默认应用访问策略 * @param appId * @param defaultStrategy */ ApplicationsManagementClient.prototype.updateDefaultAccessPolicy = function (appId, defaultStrategy) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.acl.updateDefaultApplicationAccessPolicy({ appId: appId, defaultStrategy: defaultStrategy })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.createRole = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.create(options.code, options.description, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.deleteRole = function (appId, code) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.delete(code, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.deleteRoles = function (appId, codes) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.deleteMany(codes, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.updateRole = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.update(options.code, __assign(__assign({}, options), { namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.findRole = function (appId, code) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, this.roles.detail(code, appId)]; }); }); }; ApplicationsManagementClient.prototype.getRoles = function (appId, options) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.list(__assign(__assign({}, options), { namespace: appId }))]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.getUsersByRoleCode = function (appId, code) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.listUsers(code, { namespace: appId })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.addUsersToRole = function (appId, code, userIds) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.addUsers(code, userIds, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.removeUsersFromRole = function (appId, code, userIds) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.removeUsers(code, userIds, appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.listAuthorizedResourcesByRole = function (appId, code, resourceType) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.roles.listAuthorizedResources(code, appId, { resourceType: resourceType })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.createAgreement = function (appId, agreement) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.agreements.create(appId, agreement)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.deleteAgreement = function (appId, agreementId) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.agreements.delete(appId, agreementId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.modifyAgreement = function (appId, agreementId, updates) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.agreements.modify(appId, agreementId, updates)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.listAgreement = function (appId) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.agreements.list(appId)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; ApplicationsManagementClient.prototype.sortAgreement = function (appId, order) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.agreements.sort(appId, order)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * 查看应用下已登录用户 * @param appId 应用 ID * @param page 当前页数 * @param limit 每页显示条数 * @returns Promise */ ApplicationsManagementClient.prototype.activeUsers = function (appId, page, limit) { if (page === void 0) { page = 1; } if (limit === void 0) { limit = 10; } return __awaiter(this, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.httpClient.request({ method: 'GET', url: this.options.host + "/api/v2/applications/" + appId + "/active-users?page=" + page + "&limit=" + limit })]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; /** * 刷新应用密钥 * @param appId 应用 ID * @returns Promise */ ApplicationsManagementClient.prototype.refreshApplicationSecret = function (appId) { return __awaiter(this, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.httpClient.request({ method: 'PATCH', url: this.options.host + "/api/v2/application/" + appId + "/refresh-secret" })]; case 1: result = _a.sent(); return [2 /*return*/, result]; } }); }); }; return ApplicationsManagementClient; }()); export { ApplicationsManagementClient }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwbGljYXRpb25zTWFuYWdlbWVudENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWFuYWdlbWVudC9BcHBsaWNhdGlvbnNNYW5hZ2VtZW50Q2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFeEU7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNIO0lBU0Usc0NBQ0UsT0FBZ0MsRUFDaEMsVUFBc0IsRUFDdEIsYUFBNEIsRUFDNUIsYUFBc0M7UUFFdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLG1CQUFtQixDQUNoQyxPQUFPLEVBQ1AsYUFBYSxFQUNiLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxxQkFBcUIsQ0FDcEMsT0FBTyxFQUNQLGFBQWEsRUFDYixhQUFhLENBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSx5QkFBeUIsQ0FDN0MsT0FBTyxFQUNQLGFBQWEsRUFDYixVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ1UsMkNBQUksR0FBakIsVUFBa0IsTUFHakI7Ozs7Ozt3QkFJTyxLQUEyQixNQUFNLElBQUksRUFBRSxFQUFyQyxZQUFRLEVBQVIsSUFBSSxtQkFBRyxDQUFDLEtBQUEsRUFBRSxhQUFVLEVBQVYsS0FBSyxtQkFBRyxFQUFFLEtBQUEsQ0FBa0I7d0JBQ2pDLHFCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dDQUN6QyxHQUFHLEVBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHlCQUFzQjtnQ0FDL0MsTUFBTSxFQUFFLEtBQUs7Z0NBQ2IsTUFBTSxFQUFFO29DQUNOLElBQUksTUFBQTtvQ0FDSixLQUFLLE9BQUE7aUNBQ047NkJBQ0YsQ0FBQyxFQUFBOzt3QkFQSSxJQUFJLEdBQUcsU0FPWDt3QkFDRixzQkFBTyxJQUFJLEVBQUM7Ozs7S0FDYjtJQUVEOzs7Ozs7O09BT0c7SUFDVSw2Q0FBTSxHQUFuQixVQUFvQixPQUtuQjs7Ozs7NEJBQ2dCLHFCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDOzRCQUMzQyxNQUFNLEVBQUUsTUFBTTs0QkFDZCxHQUFHLEVBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHlCQUFzQjs0QkFDL0MsSUFBSSxlQUFPLE9BQU8sQ0FBRTt5QkFDckIsQ0FBQyxFQUFBOzt3QkFKSSxNQUFNLEdBQUcsU0FJYjt3QkFDRixzQkFBTyxNQUFNLEVBQUM7Ozs7S0FDZjtJQUVEOzs7O09BSUc7SUFDVSw2Q0FBTSxHQUFuQixVQUFvQixLQUFhOzs7Ozs7O3dCQUU3QixxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQ0FDNUIsTUFBTSxFQUFFLFFBQVE7Z0NBQ2hCLEdBQUcsRUFBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksNkJBQXdCLEtBQU87NkJBQ3pELENBQUMsRUFBQTs7d0JBSEYsU0FHRSxDQUFDO3dCQUVILHNCQUFPLElBQUksRUFBQzs7O3dCQUVaLE1BQU0sT0FBSyxDQUFDOzs7OztLQUVmO0lBRUQ7OztPQUdHO0lBQ1UsK0NBQVEsR0FBckIsVUFBc0IsRUFBVTs7Ozs7O3dCQUM5QixJQUFJLENBQUMsRUFBRSxFQUFFOzRCQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQzt5QkFDM0M7d0JBQ1kscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7Z0NBQ3pDLEdBQUcsRUFBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksNkJBQXdCLEVBQUk7Z0NBQ3JELE1BQU0sRUFBRSxLQUFLOzZCQUNkLENBQUMsRUFBQTs7d0JBSEksSUFBSSxHQUFHLFNBR1g7d0JBQ0Ysc0JBQU8sSUFBSSxFQUFDOzs7O0tBQ2I7SUFFWSxvREFBYSxHQUExQixVQUNFLEtBQWEsRUFDYixPQUlDOzs7OzRCQUVNLHFCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSx1QkFDN0IsT0FBTyxLQUNWLFNBQVMsRUFBRSxLQUFLLElBQ2hCLEVBQUE7NEJBSEYsc0JBQU8sU0FHTCxFQUFDOzs7O0tBQ0o7SUFFWSxxREFBYyxHQUEzQixVQUNFLEtBQWEsRUFDYixPQVFDOzs7OzRCQUVNLHFCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyx1QkFDL0IsT0FBTyxLQUNWLFNBQVMsRUFBRSxLQUFLLElBQ2hCLEVBQUE7NEJBSEYsc0JBQU8sU0FHTCxFQUFDOzs7O0tBQ0o7SUFFWSxxREFBYyxHQUEzQixVQUNFLEtBQWEsRUFDYixPQVFDOzs7OzRCQUVNLHFCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLHdCQUM1QyxPQUFPLEtBQ1YsU0FBUyxFQUFFLEtBQUssSUFDaEIsRUFBQTs0QkFIRixzQkFBTyxTQUdMLEVBQUM7Ozs7S0FDSjtJQUVZLHFEQUFjLEdBQTNCLFVBQTRCLEtBQWEsRUFBRSxJQUFZOzs7OzRCQUM5QyxxQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUE7NEJBQWpELHNCQUFPLFNBQTBDLEVBQUM7Ozs7S0FDbkQ7SUFFRDs7OztPQUlHO0lBQ1Usd0RBQWlCLEdBQTlCLFVBQ0UsS0FBYSxFQUNiLE9BR0M7Ozs7NEJBRU0scUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsdUJBQzdDLE9BQU8sS0FDVixLQUFLLE9BQUEsSUFDTCxFQUFBOzRCQUhGLHNCQUFPLFNBR0wsRUFBQzs7OztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNVLHlEQUFrQixHQUEvQixVQUNFLEtBQWEsRUFDYixPQUlDOzs7OzRCQUVNLHFCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsNkJBQTZCLHVCQUM5QyxPQUFPLEtBQ1YsS0FBSyxPQUFBLEVBQ0wsU0FBUyxFQUFFLEtBQUssSUFDaEIsRUFBQTs0QkFKRixzQkFBTyxTQUlMLEVBQUM7Ozs7S0FDSjtJQUVEOzs7O09BSUc7SUFDVSwwREFBbUIsR0FBaEMsVUFDRSxLQUFhLEVBQ2IsT0FJQzs7Ozs0QkFFTSxxQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLDhCQUE4Qix1QkFDL0MsT0FBTyxLQUNWLEtBQUssT0FBQSxFQUNMLFNBQVMsRUFBRSxLQUFLLElBQ2hCLEVBQUE7NEJBSkYsc0JBQU8sU0FJTCxFQUFDOzs7O0tBQ0o7SUFFRDs7OztPQUlHO0lBQ1UseURBQWtCLEdBQS9CLFVBQ0UsS0FBYSxFQUNiLE9BSUM7Ozs7NEJBRU0scUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsdUJBQzlDLE9BQU8sS0FDVixLQUFLLE9BQUEsRUFDTCxTQUFTLEVBQUUsS0FBSyxJQUNoQixFQUFBOzRCQUpGLHNCQUFPLFNBSUwsRUFBQzs7OztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNVLGtEQUFXLEdBQXhCLFVBQ0UsS0FBYSxFQUNiLE9BSUM7Ozs7NEJBRU0scUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsdUJBQ3ZDLE9BQU8sS0FDVixLQUFLLE9BQUEsRUFDTCxTQUFTLEVBQUUsS0FBSyxJQUNoQixFQUFBOzRCQUpGLHNCQUFPLFNBSUwsRUFBQzs7OztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNVLGlEQUFVLEdBQXZCLFVBQ0UsS0FBYSxFQUNiLE9BSUM7Ozs7NEJBRU0scUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsdUJBQ3RDLE9BQU8sS0FDVixLQUFLLE9BQUEsRUFDTCxTQUFTLEVBQUUsS0FBSyxJQUNoQixFQUFBOzRCQUpGLHNCQUFPLFNBSUwsRUFBQzs7OztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNVLGdFQUF5QixHQUF0QyxVQUNFLEtBQWEsRUFDYixlQUF5Qzs7Ozs0QkFFbEMscUJBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQzs0QkFDekQsS0FBSyxPQUFBOzRCQUNMLGVBQWUsaUJBQUE7eUJBQ2hCLENBQUMsRUFBQTs0QkFIRixzQkFBTyxTQUdMLEVBQUM7Ozs7S0FDSjtJQUVZLGlEQUFVLEdBQXZCLFVBQ0UsS0FBYSxFQUNiLE9BR0M7Ozs7NEJBRU0scUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFBOzRCQUF4RSxzQkFBTyxTQUFpRSxFQUFDOzs7O0tBQzFFO0lBRVksaURBQVUsR0FBdkIsVUFBd0IsS0FBYSxFQUFFLElBQVk7Ozs7NEJBQzFDLHFCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBQTs0QkFBM0Msc0JBQU8sU0FBb0MsRUFBQzs7OztLQUM3QztJQUVZLGtEQUFXLEdBQXhCLFVBQXlCLEtBQWEsRUFBRSxLQUFlOzs7OzRCQUM5QyxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUE7NEJBQWhELHNCQUFPLFNBQXlDLEVBQUM7Ozs7S0FDbEQ7SUFFWSxpREFBVSxHQUF2QixVQUNFLEtBQWEsRUFDYixPQUlDOzs7OzRCQUVNLHFCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHdCQUN0QyxPQUFPLEtBQ1YsU0FBUyxFQUFFLEtBQUssSUFDaEIsRUFBQTs0QkFIRixzQkFBTyxTQUdMLEVBQUM7Ozs7S0FDSjtJQUVZLCtDQUFRLEdBQXJCLFVBQXNCLEtBQWEsRUFBRSxJQUFZOzs7Z0JBQy9DLHNCQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBQzs7O0tBQ3ZDO0lBRVksK0NBQVEsR0FBckIsVUFDRSxLQUFhLEVBQ2IsT0FHQzs7Ozs0QkFFTSxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksdUJBQ3ZCLE9BQU8sS0FDVixTQUFTLEVBQUUsS0FBSyxJQUNoQixFQUFBOzRCQUhGLHNCQUFPLFNBR0wsRUFBQzs7OztLQUNKO0lBRVkseURBQWtCLEdBQS9CLFVBQWdDLEtBQWEsRUFBRSxJQUFZOzs7OzRCQUNsRCxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7NEJBQ3RDLFNBQVMsRUFBRSxLQUFLO3lCQUNqQixDQUFDLEVBQUE7NEJBRkYsc0JBQU8sU0FFTCxFQUFDOzs7O0tBQ0o7SUFFWSxxREFBYyxHQUEzQixVQUE0QixLQUFhLEVBQUUsSUFBWSxFQUFFLE9BQWlCOzs7OzRCQUNqRSxxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFBOzRCQUF0RCxzQkFBTyxTQUErQyxFQUFDOzs7O0tBQ3hEO0lBRVksMERBQW1CLEdBQWhDLFVBQ0UsS0FBYSxFQUNiLElBQVksRUFDWixPQUFpQjs7Ozs0QkFFVixxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFBOzRCQUF6RCxzQkFBTyxTQUFrRCxFQUFDOzs7O0tBQzNEO0lBRVksb0VBQTZCLEdBQTFDLFVBQ0UsS0FBYSxFQUNiLElBQVksRUFDWixZQUEyQjs7Ozs0QkFFcEIscUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFOzRCQUMzRCxZQUFZLGNBQUE7eUJBQ2IsQ0FBQyxFQUFBOzRCQUZGLHNCQUFPLFNBRUwsRUFBQzs7OztLQUNKO0lBRVksc0RBQWUsR0FBNUIsVUFBNkIsS0FBYSxFQUFFLFNBQXlCOzs7OzRCQUM1RCxxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUE7NEJBQXJELHNCQUFPLFNBQThDLEVBQUM7Ozs7S0FDdkQ7SUFFWSxzREFBZSxHQUE1QixVQUE2QixLQUFhLEVBQUUsV0FBbUI7Ozs7NEJBQ3RELHFCQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBQTs0QkFBdkQsc0JBQU8sU0FBZ0QsRUFBQzs7OztLQUN6RDtJQUVZLHNEQUFlLEdBQTVCLFVBQ0UsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLE9BQXVCOzs7OzRCQUVoQixxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxFQUFBOzRCQUFoRSxzQkFBTyxTQUF5RCxFQUFDOzs7O0tBQ2xFO0lBRVksb0RBQWEsR0FBMUIsVUFBMkIsS0FBYTs7Ozs0QkFDL0IscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUE7NEJBQXhDLHNCQUFPLFNBQWlDLEVBQUM7Ozs7S0FDMUM7SUFFWSxvREFBYSxHQUExQixVQUEyQixLQUFhLEVBQUUsS0FBZTs7Ozs0QkFDaEQscUJBQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFBOzRCQUEvQyxzQkFBTyxTQUF3QyxFQUFDOzs7O0tBQ2pEO0lBRUQ7Ozs7OztPQU1HO0lBQ1Usa0RBQVcsR0FBeEIsVUFDRSxLQUFhLEVBQ2IsSUFBZ0IsRUFDaEIsS0FBa0I7UUFEbEIscUJBQUEsRUFBQSxRQUFnQjtRQUNoQixzQkFBQSxFQUFBLFVBQWtCOzs7Ozs0QkFFSCxxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDM0MsTUFBTSxFQUFFLEtBQUs7NEJBQ2IsR0FBRyxFQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSw2QkFBd0IsS0FBSywyQkFBc0IsSUFBSSxlQUFVLEtBQU87eUJBQ2xHLENBQUMsRUFBQTs7d0JBSEksTUFBTSxHQUFHLFNBR2I7d0JBQ0Ysc0JBQU8sTUFBTSxFQUFDOzs7O0tBQ2Y7SUFFRDs7OztPQUlHO0lBQ1UsK0RBQXdCLEdBQXJDLFVBQXNDLEtBQWE7Ozs7OzRCQUNsQyxxQkFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzs0QkFDM0MsTUFBTSxFQUFFLE9BQU87NEJBQ2YsR0FBRyxFQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSw0QkFBdUIsS0FBSyxvQkFBaUI7eUJBQ3ZFLENBQUMsRUFBQTs7d0JBSEksTUFBTSxHQUFHLFNBR2I7d0JBQ0Ysc0JBQU8sTUFBTSxFQUFDOzs7O0tBQ2Y7SUFDSCxtQ0FBQztBQUFELENBQUMsQUFuYkQsSUFtYkMifQ==