@umbraco/headless-client
Version:
Node.js client library for the Umbraco Headless APIs
345 lines • 30.7 kB
JavaScript
"use strict";
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 };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContentManagementClient = void 0;
var Endpoints_1 = require("../../Endpoints");
/**
* ContentManagementClient is used to access the Content part of the Content Management API.
* @public
*
* @example
* The {@link ContentManagementClient} must be accessed through {@link Client}.
*
* ```typescript
* import { Client } from '@umbraco/headless-client'
*
* const client = new Client({
* projectAlias: '<your-project-alias>',
* apiKey: '<your-api-key>',
* language: '<iso-code>',
* })
*
* const contentClient = client.management.content
* ```
*/
var ContentManagementClient = /** @class */ (function () {
/**
* @internal
*/
function ContentManagementClient(client) {
var _this = this;
this.client = client;
this.makeRequest = function (endpoint, data) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.client.makeRequest(endpoint, data)];
});
}); };
}
/**
* Fetch all content at the root of the tree, which the authorized user has access to according to the 'Start node'-permissions.
* @returns a `Promise` that resolves to an array of {@link ContentManagementContent},
*/
ContentManagementClient.prototype.root = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.makeRequest(Endpoints_1.Endpoints.management.content.root())];
});
});
};
/**
* Fetch a single Content item by its id.
* @param id - GUID id of the Content item.
* @returns a `Promise` that resolves to a {@link ContentManagementContent} if found, otherwise `undefined`.
*/
ContentManagementClient.prototype.byId = function (id) {
return __awaiter(this, void 0, void 0, function () {
var err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.byId(id))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_1 = _a.sent();
if (err_1.response && err_1.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_1;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Fetch all children of a Content item.
* @param id - GUID id of the Content item.
* @param options - Request options. See {@link APIContentChildrenOptions}.
* @returns a `Promise` that resolves to a {@link PagedResponse} of {@link ContentManagementContent} if found, otherwise `undefined`.
*/
ContentManagementClient.prototype.children = function (id, options) {
return __awaiter(this, void 0, void 0, function () {
var err_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.children(id, options))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_2 = _a.sent();
if (err_2.response && err_2.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_2;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Create a new Content item.
* @param body - The Content to create. See {@link ContentManagementContentRequest}.
* @returns a `Promise` that resolves to the newly created {@link ContentManagementContent}.
*
* @example
* ```typescript
* const content = await client.management.content.create({
* name: {
* $invariant: '<name>',
* },
* contentTypeAlias: '<content-type-alias>',
* parentId: '<parentId|undefined>',
* })
* ```
*
* If the Content Type includes an `Upload` or an `Image Cropper` property and you want to upload a file you need to pass a `FormData` object to the function instead,
*
* ```typescript
* import FormData from `form-data`
* import fs from 'fs'
* import path from 'path'
*
* const data = new FormData()
*
* data.append(JSON.stringify({
* name: {
* $invariant: '<name>',
* },
* contentTypeAlias: '<content-type-alias>',
* parentId: '<parentId|undefined>',
* // if myFile is of type `Upload` and is culture variant
* myFile: {
* 'en-US': 'my-file.txt',
* },
* // if myImage is of type `Image Cropper` and is culture invariant
* myImage: {
* $invariant: {
* src: 'my-image.jpg',
* },
* },
* }))
*
* data.append('myFile.en-US', fs.createReadStream(path.join(__dirname, 'my-file.txt')))
* data.append('myImage.$invariant', fs.createReadStream(path.join(__dirname, 'my-image.txt')))
*
* const content = await client.management.content.create(data)
* ```
*
* See {@link https://our.umbraco.com/documentation/Umbraco-Heartcore/API-Documentation/Content-Management/content/#create-content} for more info on the structure of the document.
*/
ContentManagementClient.prototype.create = function (body) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.makeRequest(Endpoints_1.Endpoints.management.content.create(), body)];
});
});
};
/**
* Publish a Content item.
* @param id - GUID id of the Content item.
* @param options - Request options. See {@link APIContentPublishOptions}.
* @returns a `Promise` that resolves to a {@link ContentManagementContent} if found, otherwise `undefined`.
*/
ContentManagementClient.prototype.publish = function (id, options) {
return __awaiter(this, void 0, void 0, function () {
var err_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.publish(id, options))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_3 = _a.sent();
if (err_3.response && err_3.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_3;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Unpublish a Content item.
* @param id - GUID id of the Content item.
* @param options - Request options. See {@link APIContentPublishOptions}.
* @returns a `Promise` that resolves to a {@link ContentManagementContent} if found, otherwise `undefined`.
*/
ContentManagementClient.prototype.unPublish = function (id, options) {
return __awaiter(this, void 0, void 0, function () {
var err_4;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.unPublish(id, options))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_4 = _a.sent();
if (err_4.response && err_4.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_4;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Update a Content item.
* @param id - GUID id of the Content item.
* @param body - Content to update, must be a complete Content item including all cultures. See {@link ContentManagementContentRequest}.
* @returns a `Promise` that resolves to a {@link ContentManagementContent} of the updated Content item if found, otherwise `undefined`.
*
* @example
* ```typescript
* const content = await client.management.content.update('<content-id>', {
* name: {
* $invariant: '<name>',
* },
* contentTypeAlias: '<content-type-alias>',
* parentId: '<parentId|undefined>',
* })
* ```
*
* If the Content Type includes an `Upload` or an `Image Cropper` property and you want to upload a file you need to pass a `FormData` object to the function instead,
*
* ```typescript
* import FormData from `form-data`
* import fs from 'fs'
* import path from 'path'
*
* const data = new FormData()
*
* data.append(JSON.stringify({
* name: {
* $invariant: '<name>',
* },
* contentTypeAlias: '<content-type-alias>',
* parentId: '<parentId|undefined>',
* // if myFile is of type `Upload` and is culture variant
* myFile: {
* 'en-US': 'my-file.txt',
* },
* // if myImage is of type `Image Cropper` and is culture invariant
* myImage: {
* $invariant: {
* src: 'my-image.jpg',
* },
* },
* }))
*
* data.append('myFile.en-US', fs.createReadStream(path.join(__dirname, 'my-file.txt')))
* data.append('myImage.$invariant', fs.createReadStream(path.join(__dirname, 'my-image.txt')))
*
* const content = await client.management.content.update('<content-id>', data)
* ```
*
* See {@link https://our.umbraco.com/documentation/Umbraco-Heartcore/API-Documentation/Content-Management/content/#update-content} for more info on the structure of the document.
*/
ContentManagementClient.prototype.update = function (id, body) {
return __awaiter(this, void 0, void 0, function () {
var err_5;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.update(id), body)];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_5 = _a.sent();
if (err_5.response && err_5.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_5;
case 3: return [2 /*return*/];
}
});
});
};
/**
* Delete a Content item.
* @param id - GUID id of the Content item.
* @returns a `Promise` that resolves to a {@link ContentManagementContent} of the deleted Content item if found, otherwise `undefined`.
*/
ContentManagementClient.prototype.delete = function (id) {
return __awaiter(this, void 0, void 0, function () {
var err_6;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, this.makeRequest(Endpoints_1.Endpoints.management.content.delete(id))];
case 1: return [2 /*return*/, _a.sent()];
case 2:
err_6 = _a.sent();
if (err_6.response && err_6.response.status === 404) {
return [2 /*return*/, undefined];
}
throw err_6;
case 3: return [2 /*return*/];
}
});
});
};
return ContentManagementClient;
}());
exports.ContentManagementClient = ContentManagementClient;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGVudE1hbmFnZW1lbnRDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQ2xpZW50cy9NYW5hZ2VtZW50L0NvbnRlbnRNYW5hZ2VtZW50Q2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLDZDQUEyQztBQUczQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0g7SUFDRTs7T0FFRztJQUNILGlDQUNtQixNQUFjO1FBRGpDLGlCQUdDO1FBRmtCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFJaEIsZ0JBQVcsR0FBRyxVQUFVLFFBQXFCLEVBQUUsSUFBVTs7Z0JBQ3hFLHNCQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBQTs7YUFDL0MsQ0FBQTtJQUpELENBQUM7SUFNRDs7O09BR0c7SUFDRyxzQ0FBSSxHQUFWOzs7Z0JBQ0Usc0JBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFLLENBQUMsRUFBQTs7O0tBQ2hFO0lBRUQ7Ozs7T0FJRztJQUNHLHNDQUFJLEdBQVYsVUFBZ0QsRUFBVTs7Ozs7Ozt3QkFFL0MscUJBQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUE7NEJBQXZFLHNCQUFPLFNBQWdFLEVBQUE7Ozt3QkFFdkUsSUFBSSxLQUFHLENBQUMsUUFBUSxJQUFJLEtBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTs0QkFDL0Msc0JBQU8sU0FBUyxFQUFBO3lCQUNqQjt3QkFDRCxNQUFNLEtBQUcsQ0FBQTs7Ozs7S0FFWjtJQUVEOzs7OztPQUtHO0lBQ0csMENBQVEsR0FBZCxVQUFvRCxFQUFV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N05ELElBNk5DO0FBN05ZLDBEQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnXG5cbmltcG9ydCB7IENsaWVudCB9IGZyb20gJy4uLy4uL0NsaWVudCdcbmltcG9ydCB7IFBhZ2VkUmVzcG9uc2UsIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudCwgQ29udGVudE1hbmFnZW1lbnRDb250ZW50UmVxdWVzdCB9IGZyb20gJy4uLy4uL1Jlc3BvbnNlcydcbmltcG9ydCB7IEVuZHBvaW50IH0gZnJvbSAnLi4vLi4vRW5kcG9pbnQnXG5pbXBvcnQgeyBFbmRwb2ludHMgfSBmcm9tICcuLi8uLi9FbmRwb2ludHMnXG5pbXBvcnQgeyBBUElDb250ZW50Q2hpbGRyZW5PcHRpb25zLCBBUElDb250ZW50UHVibGlzaE9wdGlvbnMsIEFQSUNvbnRlbnRVbnB1Ymxpc2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vUmVxdWVzdE9wdGlvbnMnXG5cbi8qKlxuICogQ29udGVudE1hbmFnZW1lbnRDbGllbnQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIENvbnRlbnQgcGFydCBvZiB0aGUgQ29udGVudCBNYW5hZ2VtZW50IEFQSS5cbiAqIEBwdWJsaWNcbiAqXG4gKiBAZXhhbXBsZVxuICogVGhlIHtAbGluayBDb250ZW50TWFuYWdlbWVudENsaWVudH0gbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHtAbGluayBDbGllbnR9LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENsaWVudCB9IGZyb20gJ0B1bWJyYWNvL2hlYWRsZXNzLWNsaWVudCdcbiAqXG4gKiBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAqICBwcm9qZWN0QWxpYXM6ICc8eW91ci1wcm9qZWN0LWFsaWFzPicsXG4gKiAgYXBpS2V5OiAnPHlvdXItYXBpLWtleT4nLFxuICogIGxhbmd1YWdlOiAnPGlzby1jb2RlPicsXG4gKiB9KVxuICpcbiAqIGNvbnN0IGNvbnRlbnRDbGllbnQgPSBjbGllbnQubWFuYWdlbWVudC5jb250ZW50XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRNYW5hZ2VtZW50Q2xpZW50IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IgKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRcbiAgKSB7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG1ha2VSZXF1ZXN0ID0gYXN5bmMgPFQ+KGVuZHBvaW50OiBFbmRwb2ludDxUPiwgZGF0YT86IGFueSkgPT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5tYWtlUmVxdWVzdChlbmRwb2ludCwgZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgY29udGVudCBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgd2hpY2ggdGhlIGF1dGhvcml6ZWQgdXNlciBoYXMgYWNjZXNzIHRvIGFjY29yZGluZyB0byB0aGUgJ1N0YXJ0IG5vZGUnLXBlcm1pc3Npb25zLlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHtAbGluayBDb250ZW50TWFuYWdlbWVudENvbnRlbnR9LFxuICAgKi9cbiAgYXN5bmMgcm9vdDxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QoRW5kcG9pbnRzLm1hbmFnZW1lbnQuY29udGVudC5yb290PFQ+KCkpXG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBzaW5nbGUgQ29udGVudCBpdGVtIGJ5IGl0cyBpZC5cbiAgICogQHBhcmFtIGlkIC0gR1VJRCBpZCBvZiB0aGUgQ29udGVudCBpdGVtLlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudH0gaWYgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFzeW5jIGJ5SWQ8VCBleHRlbmRzIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudD4gKGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFrZVJlcXVlc3QoRW5kcG9pbnRzLm1hbmFnZW1lbnQuY29udGVudC5ieUlkPFQ+KGlkKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgY2hpbGRyZW4gb2YgYSBDb250ZW50IGl0ZW0uXG4gICAqIEBwYXJhbSBpZCAtIEdVSUQgaWQgb2YgdGhlIENvbnRlbnQgaXRlbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IG9wdGlvbnMuIFNlZSB7QGxpbmsgQVBJQ29udGVudENoaWxkcmVuT3B0aW9uc30uXG4gICAqIEByZXR1cm5zIGEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgUGFnZWRSZXNwb25zZX0gb2Yge0BsaW5rIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudH0gaWYgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFzeW5jIGNoaWxkcmVuPFQgZXh0ZW5kcyBDb250ZW50TWFuYWdlbWVudENvbnRlbnQ+IChpZDogc3RyaW5nLCBvcHRpb25zPzogQVBJQ29udGVudENoaWxkcmVuT3B0aW9ucyk6IFByb21pc2U8UGFnZWRSZXNwb25zZTxUPiB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdChFbmRwb2ludHMubWFuYWdlbWVudC5jb250ZW50LmNoaWxkcmVuKGlkLCBvcHRpb25zKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgQ29udGVudCBpdGVtLlxuICAgKiBAcGFyYW0gYm9keSAtIFRoZSBDb250ZW50IHRvIGNyZWF0ZS4gU2VlIHtAbGluayBDb250ZW50TWFuYWdlbWVudENvbnRlbnRSZXF1ZXN0fS5cbiAgICogQHJldHVybnMgYSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRDb250ZW50fS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250ZW50ID0gYXdhaXQgY2xpZW50Lm1hbmFnZW1lbnQuY29udGVudC5jcmVhdGUoe1xuICAgKiAgbmFtZToge1xuICAgKiAgICAkaW52YXJpYW50OiAnPG5hbWU+JyxcbiAgICogIH0sXG4gICAqICBjb250ZW50VHlwZUFsaWFzOiAnPGNvbnRlbnQtdHlwZS1hbGlhcz4nLFxuICAgKiAgcGFyZW50SWQ6ICc8cGFyZW50SWR8dW5kZWZpbmVkPicsXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBJZiB0aGUgQ29udGVudCBUeXBlIGluY2x1ZGVzIGFuIGBVcGxvYWRgIG9yIGFuIGBJbWFnZSBDcm9wcGVyYCBwcm9wZXJ0eSBhbmQgeW91IHdhbnQgdG8gdXBsb2FkIGEgZmlsZSB5b3UgbmVlZCB0byBwYXNzIGEgYEZvcm1EYXRhYCBvYmplY3QgdG8gdGhlIGZ1bmN0aW9uIGluc3RlYWQsXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IEZvcm1EYXRhIGZyb20gYGZvcm0tZGF0YWBcbiAgICogaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuICAgKiBpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuICAgKlxuICAgKiBjb25zdCBkYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICpcbiAgICogZGF0YS5hcHBlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgKiAgbmFtZToge1xuICAgKiAgICAkaW52YXJpYW50OiAnPG5hbWU+JyxcbiAgICogIH0sXG4gICAqICBjb250ZW50VHlwZUFsaWFzOiAnPGNvbnRlbnQtdHlwZS1hbGlhcz4nLFxuICAgKiAgcGFyZW50SWQ6ICc8cGFyZW50SWR8dW5kZWZpbmVkPicsXG4gICAqICAvLyBpZiBteUZpbGUgaXMgb2YgdHlwZSBgVXBsb2FkYCBhbmQgaXMgY3VsdHVyZSB2YXJpYW50XG4gICAqICBteUZpbGU6IHtcbiAgICogICAgJ2VuLVVTJzogJ215LWZpbGUudHh0JyxcbiAgICogIH0sXG4gICAqICAvLyBpZiBteUltYWdlIGlzIG9mIHR5cGUgYEltYWdlIENyb3BwZXJgIGFuZCBpcyBjdWx0dXJlIGludmFyaWFudFxuICAgKiAgbXlJbWFnZToge1xuICAgKiAgICAkaW52YXJpYW50OiB7XG4gICAqICAgICAgc3JjOiAnbXktaW1hZ2UuanBnJyxcbiAgICogICAgfSxcbiAgICogIH0sXG4gICAqIH0pKVxuICAgKlxuICAgKiBkYXRhLmFwcGVuZCgnbXlGaWxlLmVuLVVTJywgZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oX19kaXJuYW1lLCAnbXktZmlsZS50eHQnKSkpXG4gICAqIGRhdGEuYXBwZW5kKCdteUltYWdlLiRpbnZhcmlhbnQnLCBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihfX2Rpcm5hbWUsICdteS1pbWFnZS50eHQnKSkpXG4gICAqXG4gICAqIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBjbGllbnQubWFuYWdlbWVudC5jb250ZW50LmNyZWF0ZShkYXRhKVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIHtAbGluayBodHRwczovL291ci51bWJyYWNvLmNvbS9kb2N1bWVudGF0aW9uL1VtYnJhY28tSGVhcnRjb3JlL0FQSS1Eb2N1bWVudGF0aW9uL0NvbnRlbnQtTWFuYWdlbWVudC9jb250ZW50LyNjcmVhdGUtY29udGVudH0gZm9yIG1vcmUgaW5mbyBvbiB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZTxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoYm9keTogQ29udGVudE1hbmFnZW1lbnRDb250ZW50UmVxdWVzdCB8IEZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QoRW5kcG9pbnRzLm1hbmFnZW1lbnQuY29udGVudC5jcmVhdGU8VD4oKSwgYm9keSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgQ29udGVudCBpdGVtLlxuICAgKiBAcGFyYW0gaWQgLSBHVUlEIGlkIG9mIHRoZSBDb250ZW50IGl0ZW0uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmVxdWVzdCBvcHRpb25zLiBTZWUge0BsaW5rIEFQSUNvbnRlbnRQdWJsaXNoT3B0aW9uc30uXG4gICAqIEByZXR1cm5zIGEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgdG8gYSB7QGxpbmsgQ29udGVudE1hbmFnZW1lbnRDb250ZW50fSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYXN5bmMgcHVibGlzaDxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoaWQ6IHN0cmluZywgb3B0aW9ucz86IEFQSUNvbnRlbnRQdWJsaXNoT3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdChFbmRwb2ludHMubWFuYWdlbWVudC5jb250ZW50LnB1Ymxpc2g8VD4oaWQsIG9wdGlvbnMpKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5yZXNwb25zZSAmJiBlcnIucmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucHVibGlzaCBhIENvbnRlbnQgaXRlbS5cbiAgICogQHBhcmFtIGlkIC0gR1VJRCBpZCBvZiB0aGUgQ29udGVudCBpdGVtLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9ucy4gU2VlIHtAbGluayBBUElDb250ZW50UHVibGlzaE9wdGlvbnN9LlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudH0gaWYgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGFzeW5jIHVuUHVibGlzaDxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoaWQ6IHN0cmluZywgb3B0aW9ucz86IEFQSUNvbnRlbnRVbnB1Ymxpc2hPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KEVuZHBvaW50cy5tYW5hZ2VtZW50LmNvbnRlbnQudW5QdWJsaXNoPFQ+KGlkLCBvcHRpb25zKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBDb250ZW50IGl0ZW0uXG4gICAqIEBwYXJhbSBpZCAtIEdVSUQgaWQgb2YgdGhlIENvbnRlbnQgaXRlbS5cbiAgICogQHBhcmFtIGJvZHkgLSBDb250ZW50IHRvIHVwZGF0ZSwgbXVzdCBiZSBhIGNvbXBsZXRlIENvbnRlbnQgaXRlbSBpbmNsdWRpbmcgYWxsIGN1bHR1cmVzLiBTZWUge0BsaW5rIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudFJlcXVlc3R9LlxuICAgKiBAcmV0dXJucyBhIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIENvbnRlbnRNYW5hZ2VtZW50Q29udGVudH0gb2YgdGhlIHVwZGF0ZWQgQ29udGVudCBpdGVtIGlmIGZvdW5kLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGVudCA9IGF3YWl0IGNsaWVudC5tYW5hZ2VtZW50LmNvbnRlbnQudXBkYXRlKCc8Y29udGVudC1pZD4nLCB7XG4gICAqICBuYW1lOiB7XG4gICAqICAgICRpbnZhcmlhbnQ6ICc8bmFtZT4nLFxuICAgKiAgfSxcbiAgICogIGNvbnRlbnRUeXBlQWxpYXM6ICc8Y29udGVudC10eXBlLWFsaWFzPicsXG4gICAqICBwYXJlbnRJZDogJzxwYXJlbnRJZHx1bmRlZmluZWQ+JyxcbiAgICogfSlcbiAgICogYGBgXG4gICAqXG4gICAqIElmIHRoZSBDb250ZW50IFR5cGUgaW5jbHVkZXMgYW4gYFVwbG9hZGAgb3IgYW4gYEltYWdlIENyb3BwZXJgIHByb3BlcnR5IGFuZCB5b3Ugd2FudCB0byB1cGxvYWQgYSBmaWxlIHlvdSBuZWVkIHRvIHBhc3MgYSBgRm9ybURhdGFgIG9iamVjdCB0byB0aGUgZnVuY3Rpb24gaW5zdGVhZCxcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgRm9ybURhdGEgZnJvbSBgZm9ybS1kYXRhYFxuICAgKiBpbXBvcnQgZnMgZnJvbSAnZnMnXG4gICAqIGltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG4gICAqXG4gICAqIGNvbnN0IGRhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgKlxuICAgKiBkYXRhLmFwcGVuZChKU09OLnN0cmluZ2lmeSh7XG4gICAqICBuYW1lOiB7XG4gICAqICAgICRpbnZhcmlhbnQ6ICc8bmFtZT4nLFxuICAgKiAgfSxcbiAgICogIGNvbnRlbnRUeXBlQWxpYXM6ICc8Y29udGVudC10eXBlLWFsaWFzPicsXG4gICAqICBwYXJlbnRJZDogJzxwYXJlbnRJZHx1bmRlZmluZWQ+JyxcbiAgICogIC8vIGlmIG15RmlsZSBpcyBvZiB0eXBlIGBVcGxvYWRgIGFuZCBpcyBjdWx0dXJlIHZhcmlhbnRcbiAgICogIG15RmlsZToge1xuICAgKiAgICAnZW4tVVMnOiAnbXktZmlsZS50eHQnLFxuICAgKiAgfSxcbiAgICogIC8vIGlmIG15SW1hZ2UgaXMgb2YgdHlwZSBgSW1hZ2UgQ3JvcHBlcmAgYW5kIGlzIGN1bHR1cmUgaW52YXJpYW50XG4gICAqICBteUltYWdlOiB7XG4gICAqICAgICRpbnZhcmlhbnQ6IHtcbiAgICogICAgICBzcmM6ICdteS1pbWFnZS5qcGcnLFxuICAgKiAgICB9LFxuICAgKiAgfSxcbiAgICogfSkpXG4gICAqXG4gICAqIGRhdGEuYXBwZW5kKCdteUZpbGUuZW4tVVMnLCBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihfX2Rpcm5hbWUsICdteS1maWxlLnR4dCcpKSlcbiAgICogZGF0YS5hcHBlbmQoJ215SW1hZ2UuJGludmFyaWFudCcsIGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKF9fZGlybmFtZSwgJ215LWltYWdlLnR4dCcpKSlcbiAgICpcbiAgICogY29uc3QgY29udGVudCA9IGF3YWl0IGNsaWVudC5tYW5hZ2VtZW50LmNvbnRlbnQudXBkYXRlKCc8Y29udGVudC1pZD4nLCBkYXRhKVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIHtAbGluayBodHRwczovL291ci51bWJyYWNvLmNvbS9kb2N1bWVudGF0aW9uL1VtYnJhY28tSGVhcnRjb3JlL0FQSS1Eb2N1bWVudGF0aW9uL0NvbnRlbnQtTWFuYWdlbWVudC9jb250ZW50LyN1cGRhdGUtY29udGVudH0gZm9yIG1vcmUgaW5mbyBvbiB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZTxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoaWQ6IHN0cmluZywgYm9keTogQ29udGVudE1hbmFnZW1lbnRDb250ZW50UmVxdWVzdCB8IEZvcm1EYXRhKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KEVuZHBvaW50cy5tYW5hZ2VtZW50LmNvbnRlbnQudXBkYXRlPFQ+KGlkKSwgYm9keSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBDb250ZW50IGl0ZW0uXG4gICAqIEBwYXJhbSBpZCAtIEdVSUQgaWQgb2YgdGhlIENvbnRlbnQgaXRlbS5cbiAgICogQHJldHVybnMgYSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBDb250ZW50TWFuYWdlbWVudENvbnRlbnR9IG9mIHRoZSBkZWxldGVkIENvbnRlbnQgaXRlbSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlIDxUIGV4dGVuZHMgQ29udGVudE1hbmFnZW1lbnRDb250ZW50PiAoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWtlUmVxdWVzdChFbmRwb2ludHMubWFuYWdlbWVudC5jb250ZW50LmRlbGV0ZShpZCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnJlc3BvbnNlICYmIGVyci5yZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cbiJdfQ==