1 | ;
|
2 | var _a, _b, _c, _d;
|
3 | Object.defineProperty(exports, "__esModule", { value: true });
|
4 | exports.OriginRequestQueryStringBehavior = exports.OriginRequestHeaderBehavior = exports.OriginRequestCookieBehavior = exports.OriginRequestPolicy = void 0;
|
5 | const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
6 | const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
7 | const core_1 = require("@aws-cdk/core");
|
8 | const cloudfront_generated_1 = require("./cloudfront.generated");
|
9 | /**
|
10 | * A Origin Request Policy configuration.
|
11 | *
|
12 | * @resource AWS::CloudFront::OriginRequestPolicy
|
13 | */
|
14 | class OriginRequestPolicy extends core_1.Resource {
|
15 | constructor(scope, id, props = {}) {
|
16 | var _e, _f, _g, _h;
|
17 | super(scope, id, {
|
18 | physicalName: props.originRequestPolicyName,
|
19 | });
|
20 | try {
|
21 | jsiiDeprecationWarnings._aws_cdk_aws_cloudfront_OriginRequestPolicyProps(props);
|
22 | }
|
23 | catch (error) {
|
24 | if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
25 | Error.captureStackTrace(error, this.constructor);
|
26 | }
|
27 | throw error;
|
28 | }
|
29 | const originRequestPolicyName = (_e = props.originRequestPolicyName) !== null && _e !== void 0 ? _e : core_1.Names.uniqueId(this);
|
30 | if (!core_1.Token.isUnresolved(originRequestPolicyName) && !originRequestPolicyName.match(/^[\w-]+$/i)) {
|
31 | throw new Error(`'originRequestPolicyName' can only include '-', '_', and alphanumeric characters, got: '${props.originRequestPolicyName}'`);
|
32 | }
|
33 | const cookies = (_f = props.cookieBehavior) !== null && _f !== void 0 ? _f : OriginRequestCookieBehavior.none();
|
34 | const headers = (_g = props.headerBehavior) !== null && _g !== void 0 ? _g : OriginRequestHeaderBehavior.none();
|
35 | const queryStrings = (_h = props.queryStringBehavior) !== null && _h !== void 0 ? _h : OriginRequestQueryStringBehavior.none();
|
36 | const resource = new cloudfront_generated_1.CfnOriginRequestPolicy(this, 'Resource', {
|
37 | originRequestPolicyConfig: {
|
38 | name: originRequestPolicyName,
|
39 | comment: props.comment,
|
40 | cookiesConfig: {
|
41 | cookieBehavior: cookies.behavior,
|
42 | cookies: cookies.cookies,
|
43 | },
|
44 | headersConfig: {
|
45 | headerBehavior: headers.behavior,
|
46 | headers: headers.headers,
|
47 | },
|
48 | queryStringsConfig: {
|
49 | queryStringBehavior: queryStrings.behavior,
|
50 | queryStrings: queryStrings.queryStrings,
|
51 | },
|
52 | },
|
53 | });
|
54 | this.originRequestPolicyId = resource.ref;
|
55 | }
|
56 | /** Imports a Origin Request Policy from its id. */
|
57 | static fromOriginRequestPolicyId(scope, id, originRequestPolicyId) {
|
58 | return new class extends core_1.Resource {
|
59 | constructor() {
|
60 | super(...arguments);
|
61 | this.originRequestPolicyId = originRequestPolicyId;
|
62 | }
|
63 | }(scope, id);
|
64 | }
|
65 | /** Use an existing managed origin request policy. */
|
66 | static fromManagedOriginRequestPolicy(managedOriginRequestPolicyId) {
|
67 | return new class {
|
68 | constructor() {
|
69 | this.originRequestPolicyId = managedOriginRequestPolicyId;
|
70 | }
|
71 | }();
|
72 | }
|
73 | }
|
74 | exports.OriginRequestPolicy = OriginRequestPolicy;
|
75 | _a = JSII_RTTI_SYMBOL_1;
|
76 | OriginRequestPolicy[_a] = { fqn: "@aws-cdk/aws-cloudfront.OriginRequestPolicy", version: "1.157.0" };
|
77 | /** This policy includes only the User-Agent and Referer headers. It doesn’t include any query strings or cookies. */
|
78 | OriginRequestPolicy.USER_AGENT_REFERER_HEADERS = OriginRequestPolicy.fromManagedOriginRequestPolicy('acba4595-bd28-49b8-b9fe-13317c0390fa');
|
79 | /** This policy includes the header that enables cross-origin resource sharing (CORS) requests when the origin is a custom origin. */
|
80 | OriginRequestPolicy.CORS_CUSTOM_ORIGIN = OriginRequestPolicy.fromManagedOriginRequestPolicy('59781a5b-3903-41f3-afcb-af62929ccde1');
|
81 | /** This policy includes the headers that enable cross-origin resource sharing (CORS) requests when the origin is an Amazon S3 bucket. */
|
82 | OriginRequestPolicy.CORS_S3_ORIGIN = OriginRequestPolicy.fromManagedOriginRequestPolicy('88a5eaf4-2fd4-4709-b370-b4c650ea3fcf');
|
83 | /** This policy includes all values (query strings, headers, and cookies) in the viewer request. */
|
84 | OriginRequestPolicy.ALL_VIEWER = OriginRequestPolicy.fromManagedOriginRequestPolicy('216adef6-5c7f-47e4-b989-5492eafa07d3');
|
85 | /** This policy is designed for use with an origin that is an AWS Elemental MediaTailor endpoint. */
|
86 | OriginRequestPolicy.ELEMENTAL_MEDIA_TAILOR = OriginRequestPolicy.fromManagedOriginRequestPolicy('775133bc-15f2-49f9-abea-afb2e0bf67d2');
|
87 | /**
|
88 | * Determines whether any cookies in viewer requests (and if so, which cookies)
|
89 | * are included in requests that CloudFront sends to the origin.
|
90 | */
|
91 | class OriginRequestCookieBehavior {
|
92 | constructor(behavior, cookies) {
|
93 | this.behavior = behavior;
|
94 | this.cookies = cookies;
|
95 | }
|
96 | /**
|
97 | * Cookies in viewer requests are not included in requests that CloudFront sends to the origin.
|
98 | * Any cookies that are listed in a CachePolicy are still included in origin requests.
|
99 | */
|
100 | static none() { return new OriginRequestCookieBehavior('none'); }
|
101 | /** All cookies in viewer requests are included in requests that CloudFront sends to the origin. */
|
102 | static all() { return new OriginRequestCookieBehavior('all'); }
|
103 | /** Only the provided `cookies` are included in requests that CloudFront sends to the origin. */
|
104 | static allowList(...cookies) {
|
105 | if (cookies.length === 0) {
|
106 | throw new Error('At least one cookie to allow must be provided');
|
107 | }
|
108 | return new OriginRequestCookieBehavior('whitelist', cookies);
|
109 | }
|
110 | }
|
111 | exports.OriginRequestCookieBehavior = OriginRequestCookieBehavior;
|
112 | _b = JSII_RTTI_SYMBOL_1;
|
113 | OriginRequestCookieBehavior[_b] = { fqn: "@aws-cdk/aws-cloudfront.OriginRequestCookieBehavior", version: "1.157.0" };
|
114 | /**
|
115 | * Determines whether any HTTP headers (and if so, which headers) are included in requests that CloudFront sends to the origin.
|
116 | */
|
117 | class OriginRequestHeaderBehavior {
|
118 | constructor(behavior, headers) {
|
119 | this.behavior = behavior;
|
120 | this.headers = headers;
|
121 | }
|
122 | /**
|
123 | * HTTP headers are not included in requests that CloudFront sends to the origin.
|
124 | * Any headers that are listed in a CachePolicy are still included in origin requests.
|
125 | */
|
126 | static none() { return new OriginRequestHeaderBehavior('none'); }
|
127 | /**
|
128 | * All HTTP headers in viewer requests are included in requests that CloudFront sends to the origin.
|
129 | * Additionally, any additional CloudFront headers provided are included; the additional headers are added by CloudFront.
|
130 | * @see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-cloudfront-headers.html
|
131 | */
|
132 | static all(...cloudfrontHeaders) {
|
133 | if (cloudfrontHeaders.length > 0) {
|
134 | if (!cloudfrontHeaders.every(header => header.startsWith('CloudFront-'))) {
|
135 | throw new Error('additional CloudFront headers passed to `OriginRequestHeaderBehavior.all()` must begin with \'CloudFront-\'');
|
136 | }
|
137 | return new OriginRequestHeaderBehavior('allViewerAndWhitelistCloudFront', cloudfrontHeaders);
|
138 | }
|
139 | else {
|
140 | return new OriginRequestHeaderBehavior('allViewer');
|
141 | }
|
142 | }
|
143 | /** Listed headers are included in requests that CloudFront sends to the origin. */
|
144 | static allowList(...headers) {
|
145 | if (headers.length === 0) {
|
146 | throw new Error('At least one header to allow must be provided');
|
147 | }
|
148 | if (headers.map(header => header.toLowerCase()).some(header => ['authorization', 'accept-encoding'].includes(header))) {
|
149 | throw new Error('you cannot pass `Authorization` or `Accept-Encoding` as header values; use a CachePolicy to forward these headers instead');
|
150 | }
|
151 | return new OriginRequestHeaderBehavior('whitelist', headers);
|
152 | }
|
153 | }
|
154 | exports.OriginRequestHeaderBehavior = OriginRequestHeaderBehavior;
|
155 | _c = JSII_RTTI_SYMBOL_1;
|
156 | OriginRequestHeaderBehavior[_c] = { fqn: "@aws-cdk/aws-cloudfront.OriginRequestHeaderBehavior", version: "1.157.0" };
|
157 | /**
|
158 | * Determines whether any URL query strings in viewer requests (and if so, which query strings)
|
159 | * are included in requests that CloudFront sends to the origin.
|
160 | */
|
161 | class OriginRequestQueryStringBehavior {
|
162 | constructor(behavior, queryStrings) {
|
163 | this.behavior = behavior;
|
164 | this.queryStrings = queryStrings;
|
165 | }
|
166 | /**
|
167 | * Query strings in viewer requests are not included in requests that CloudFront sends to the origin.
|
168 | * Any query strings that are listed in a CachePolicy are still included in origin requests.
|
169 | */
|
170 | static none() { return new OriginRequestQueryStringBehavior('none'); }
|
171 | /** All query strings in viewer requests are included in requests that CloudFront sends to the origin. */
|
172 | static all() { return new OriginRequestQueryStringBehavior('all'); }
|
173 | /** Only the provided `queryStrings` are included in requests that CloudFront sends to the origin. */
|
174 | static allowList(...queryStrings) {
|
175 | if (queryStrings.length === 0) {
|
176 | throw new Error('At least one query string to allow must be provided');
|
177 | }
|
178 | return new OriginRequestQueryStringBehavior('whitelist', queryStrings);
|
179 | }
|
180 | }
|
181 | exports.OriginRequestQueryStringBehavior = OriginRequestQueryStringBehavior;
|
182 | _d = JSII_RTTI_SYMBOL_1;
|
183 | OriginRequestQueryStringBehavior[_d] = { fqn: "@aws-cdk/aws-cloudfront.OriginRequestQueryStringBehavior", version: "1.157.0" };
|
184 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLXJlcXVlc3QtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsib3JpZ2luLXJlcXVlc3QtcG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdDQUF1RDtBQUV2RCxpRUFBZ0U7QUFpRGhFOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLGVBQVE7SUE2Qi9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBa0MsRUFBRTs7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLHVCQUF1QjtTQUM1QyxDQUFDLENBQUM7Ozs7Ozs7Ozs7UUFFSCxNQUFNLHVCQUF1QixTQUFHLEtBQUssQ0FBQyx1QkFBdUIsbUNBQUksWUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsWUFBSyxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsMkZBQTJGLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUM7U0FDOUk7UUFFRCxNQUFNLE9BQU8sU0FBRyxLQUFLLENBQUMsY0FBYyxtQ0FBSSwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxNQUFNLE9BQU8sU0FBRyxLQUFLLENBQUMsY0FBYyxtQ0FBSSwyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRSxNQUFNLFlBQVksU0FBRyxLQUFLLENBQUMsbUJBQW1CLG1DQUFJLGdDQUFnQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFGLE1BQU0sUUFBUSxHQUFHLElBQUksNkNBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM1RCx5QkFBeUIsRUFBRTtnQkFDekIsSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixhQUFhLEVBQUU7b0JBQ2IsY0FBYyxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUNoQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87aUJBQ3pCO2dCQUNELGFBQWEsRUFBRTtvQkFDYixjQUFjLEVBQUUsT0FBTyxDQUFDLFFBQVE7b0JBQ2hDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztpQkFDekI7Z0JBQ0Qsa0JBQWtCLEVBQUU7b0JBQ2xCLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxRQUFRO29CQUMxQyxZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVk7aUJBQ3hDO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztLQUMzQztJQWxERCxtREFBbUQ7SUFDNUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLHFCQUE2QjtRQUNqRyxPQUFPLElBQUksS0FBTSxTQUFRLGVBQVE7WUFBdEI7O2dCQUNPLDBCQUFxQixHQUFHLHFCQUFxQixDQUFDO1lBQ2hFLENBQUM7U0FBQSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUNkO0lBRUQscURBQXFEO0lBQzdDLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyw0QkFBb0M7UUFDaEYsT0FBTyxJQUFJO1lBQUE7Z0JBQ08sMEJBQXFCLEdBQUcsNEJBQTRCLENBQUM7WUFDdkUsQ0FBQztTQUFBLEVBQUUsQ0FBQztLQUNMOztBQXpCSCxrREFnRUM7OztBQTlEQyxxSEFBcUg7QUFDOUYsOENBQTBCLEdBQUcsbUJBQW1CLENBQUMsOEJBQThCLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUMvSSxxSUFBcUk7QUFDOUcsc0NBQWtCLEdBQUcsbUJBQW1CLENBQUMsOEJBQThCLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUN2SSx5SUFBeUk7QUFDbEgsa0NBQWMsR0FBRyxtQkFBbUIsQ0FBQyw4QkFBOEIsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBQ25JLG1HQUFtRztBQUM1RSw4QkFBVSxHQUFHLG1CQUFtQixDQUFDLDhCQUE4QixDQUFDLHNDQUFzQyxDQUFDLENBQUM7QUFDL0gsb0dBQW9HO0FBQzdFLDBDQUFzQixHQUFHLG1CQUFtQixDQUFDLDhCQUE4QixDQUFDLHNDQUFzQyxDQUFDLENBQUM7QUF1RDdJOzs7R0FHRztBQUNILE1BQWEsMkJBQTJCO0lBdUJ0QyxZQUFvQixRQUFnQixFQUFFLE9BQWtCO1FBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0tBQ3hCO0lBekJEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7SUFFeEUsbUdBQW1HO0lBQzVGLE1BQU0sQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFFdEUsZ0dBQWdHO0lBQ3pGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFpQjtRQUMxQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDOUQ7O0FBaEJILGtFQTJCQzs7O0FBRUQ7O0dBRUc7QUFDSCxNQUFhLDJCQUEyQjtJQXVDdEMsWUFBb0IsUUFBZ0IsRUFBRSxPQUFrQjtRQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztLQUN4QjtJQXpDRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO0lBRXhFOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsaUJBQTJCO1FBQzlDLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFO2dCQUN4RSxNQUFNLElBQUksS0FBSyxDQUFDLDZHQUE2RyxDQUFDLENBQUM7YUFDaEk7WUFDRCxPQUFPLElBQUksMkJBQTJCLENBQUMsaUNBQWlDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUM5RjthQUFNO1lBQ0wsT0FBTyxJQUFJLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO0tBQ0Y7SUFFRCxtRkFBbUY7SUFDNUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQWlCO1FBQzFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtZQUNySCxNQUFNLElBQUksS0FBSyxDQUFDLDJIQUEySCxDQUFDLENBQUM7U0FDOUk7UUFDRCxPQUFPLElBQUksMkJBQTJCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzlEOztBQWhDSCxrRUEyQ0M7OztBQUVEOzs7R0FHRztBQUNILE1BQWEsZ0NBQWdDO0lBdUIzQyxZQUFvQixRQUFnQixFQUFFLFlBQXVCO1FBQzNELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0tBQ2xDO0lBekJEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7SUFFN0UseUdBQXlHO0lBQ2xHLE1BQU0sQ0FBQyxHQUFHLEtBQUssT0FBTyxJQUFJLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFFM0UscUdBQXFHO0lBQzlGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFzQjtRQUMvQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztTQUN4RTtRQUNELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDeEU7O0FBaEJILDRFQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hbWVzLCBSZXNvdXJjZSwgVG9rZW4gfSBmcm9tICdAYXdzLWNkay9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2ZuT3JpZ2luUmVxdWVzdFBvbGljeSB9IGZyb20gJy4vY2xvdWRmcm9udC5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBPcmlnaW4gUmVxdWVzdCBQb2xpY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJT3JpZ2luUmVxdWVzdFBvbGljeSB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbiByZXF1ZXN0IHBvbGljeVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5SZXF1ZXN0UG9saWN5SWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIE9yaWdpbiBSZXF1ZXN0IFBvbGljeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpblJlcXVlc3RQb2xpY3lQcm9wcyB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kuXG4gICAqIFRoZSBuYW1lIG11c3Qgb25seSBpbmNsdWRlICctJywgJ18nLCBvciBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy5cbiAgICogQGRlZmF1bHQgLSBnZW5lcmF0ZWQgZnJvbSB0aGUgYGlkYFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWVudCB0byBkZXNjcmliZSB0aGUgb3JpZ2luIHJlcXVlc3QgcG9saWN5LlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGNvbW1lbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb29raWVzIGZyb20gdmlld2VyIHJlcXVlc3RzIHRvIGluY2x1ZGUgaW4gb3JpZ2luIHJlcXVlc3RzLlxuICAgKiBAZGVmYXVsdCBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3Iubm9uZSgpXG4gICAqL1xuICByZWFkb25seSBjb29raWVCZWhhdmlvcj86IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvcjtcblxuICAvKipcbiAgICogVGhlIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIGluIG9yaWdpbiByZXF1ZXN0cy4gVGhlc2UgY2FuIGluY2x1ZGUgaGVhZGVycyBmcm9tIHZpZXdlciByZXF1ZXN0cyBhbmQgYWRkaXRpb25hbCBoZWFkZXJzIGFkZGVkIGJ5IENsb3VkRnJvbnQuXG4gICAqIEBkZWZhdWx0IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5ub25lKClcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlckJlaGF2aW9yPzogT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHF1ZXJ5IHN0cmluZ3MgZnJvbSB2aWV3ZXIgcmVxdWVzdHMgdG8gaW5jbHVkZSBpbiBvcmlnaW4gcmVxdWVzdHMuXG4gICAqIEBkZWZhdWx0IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKVxuICAgKi9cbiAgcmVhZG9ubHkgcXVlcnlTdHJpbmdCZWhhdmlvcj86IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yO1xufVxuXG4vKipcbiAqIEEgT3JpZ2luIFJlcXVlc3QgUG9saWN5IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHJlc291cmNlIEFXUzo6Q2xvdWRGcm9udDo6T3JpZ2luUmVxdWVzdFBvbGljeVxuICovXG5leHBvcnQgY2xhc3MgT3JpZ2luUmVxdWVzdFBvbGljeSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuXG4gIC8qKiBUaGlzIHBvbGljeSBpbmNsdWRlcyBvbmx5IHRoZSBVc2VyLUFnZW50IGFuZCBSZWZlcmVyIGhlYWRlcnMuIEl0IGRvZXNu4oCZdCBpbmNsdWRlIGFueSBxdWVyeSBzdHJpbmdzIG9yIGNvb2tpZXMuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVVNFUl9BR0VOVF9SRUZFUkVSX0hFQURFUlMgPSBPcmlnaW5SZXF1ZXN0UG9saWN5LmZyb21NYW5hZ2VkT3JpZ2luUmVxdWVzdFBvbGljeSgnYWNiYTQ1OTUtYmQyOC00OWI4LWI5ZmUtMTMzMTdjMDM5MGZhJyk7XG4gIC8qKiBUaGlzIHBvbGljeSBpbmNsdWRlcyB0aGUgaGVhZGVyIHRoYXQgZW5hYmxlcyBjcm9zcy1vcmlnaW4gcmVzb3VyY2Ugc2hhcmluZyAoQ09SUykgcmVxdWVzdHMgd2hlbiB0aGUgb3JpZ2luIGlzIGEgY3VzdG9tIG9yaWdpbi4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT1JTX0NVU1RPTV9PUklHSU4gPSBPcmlnaW5SZXF1ZXN0UG9saWN5LmZyb21NYW5hZ2VkT3JpZ2luUmVxdWVzdFBvbGljeSgnNTk3ODFhNWItMzkwMy00MWYzLWFmY2ItYWY2MjkyOWNjZGUxJyk7XG4gIC8qKiBUaGlzIHBvbGljeSBpbmNsdWRlcyB0aGUgaGVhZGVycyB0aGF0IGVuYWJsZSBjcm9zcy1vcmlnaW4gcmVzb3VyY2Ugc2hhcmluZyAoQ09SUykgcmVxdWVzdHMgd2hlbiB0aGUgb3JpZ2luIGlzIGFuIEFtYXpvbiBTMyBidWNrZXQuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09SU19TM19PUklHSU4gPSBPcmlnaW5SZXF1ZXN0UG9saWN5LmZyb21NYW5hZ2VkT3JpZ2luUmVxdWVzdFBvbGljeSgnODhhNWVhZjQtMmZkNC00NzA5LWIzNzAtYjRjNjUwZWEzZmNmJyk7XG4gIC8qKiBUaGlzIHBvbGljeSBpbmNsdWRlcyBhbGwgdmFsdWVzIChxdWVyeSBzdHJpbmdzLCBoZWFkZXJzLCBhbmQgY29va2llcykgaW4gdGhlIHZpZXdlciByZXF1ZXN0LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFMTF9WSUVXRVIgPSBPcmlnaW5SZXF1ZXN0UG9saWN5LmZyb21NYW5hZ2VkT3JpZ2luUmVxdWVzdFBvbGljeSgnMjE2YWRlZjYtNWM3Zi00N2U0LWI5ODktNTQ5MmVhZmEwN2QzJyk7XG4gIC8qKiBUaGlzIHBvbGljeSBpcyBkZXNpZ25lZCBmb3IgdXNlIHdpdGggYW4gb3JpZ2luIHRoYXQgaXMgYW4gQVdTIEVsZW1lbnRhbCBNZWRpYVRhaWxvciBlbmRwb2ludC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBFTEVNRU5UQUxfTUVESUFfVEFJTE9SID0gT3JpZ2luUmVxdWVzdFBvbGljeS5mcm9tTWFuYWdlZE9yaWdpblJlcXVlc3RQb2xpY3koJzc3NTEzM2JjLTE1ZjItNDlmOS1hYmVhLWFmYjJlMGJmNjdkMicpO1xuXG4gIC8qKiBJbXBvcnRzIGEgT3JpZ2luIFJlcXVlc3QgUG9saWN5IGZyb20gaXRzIGlkLiAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21PcmlnaW5SZXF1ZXN0UG9saWN5SWQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgb3JpZ2luUmVxdWVzdFBvbGljeUlkOiBzdHJpbmcpOiBJT3JpZ2luUmVxdWVzdFBvbGljeSB7XG4gICAgcmV0dXJuIG5ldyBjbGFzcyBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgICAgcHVibGljIHJlYWRvbmx5IG9yaWdpblJlcXVlc3RQb2xpY3lJZCA9IG9yaWdpblJlcXVlc3RQb2xpY3lJZDtcbiAgICB9KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKiogVXNlIGFuIGV4aXN0aW5nIG1hbmFnZWQgb3JpZ2luIHJlcXVlc3QgcG9saWN5LiAqL1xuICBwcml2YXRlIHN0YXRpYyBmcm9tTWFuYWdlZE9yaWdpblJlcXVlc3RQb2xpY3kobWFuYWdlZE9yaWdpblJlcXVlc3RQb2xpY3lJZDogc3RyaW5nKTogSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgIHJldHVybiBuZXcgY2xhc3MgaW1wbGVtZW50cyBJT3JpZ2luUmVxdWVzdFBvbGljeSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luUmVxdWVzdFBvbGljeUlkID0gbWFuYWdlZE9yaWdpblJlcXVlc3RQb2xpY3lJZDtcbiAgICB9KCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luUmVxdWVzdFBvbGljeUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yaWdpblJlcXVlc3RQb2xpY3lQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLm9yaWdpblJlcXVlc3RQb2xpY3lOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWUgPSBwcm9wcy5vcmlnaW5SZXF1ZXN0UG9saWN5TmFtZSA/PyBOYW1lcy51bmlxdWVJZCh0aGlzKTtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChvcmlnaW5SZXF1ZXN0UG9saWN5TmFtZSkgJiYgIW9yaWdpblJlcXVlc3RQb2xpY3lOYW1lLm1hdGNoKC9eW1xcdy1dKyQvaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJ29yaWdpblJlcXVlc3RQb2xpY3lOYW1lJyBjYW4gb25seSBpbmNsdWRlICctJywgJ18nLCBhbmQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGdvdDogJyR7cHJvcHMub3JpZ2luUmVxdWVzdFBvbGljeU5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvb2tpZXMgPSBwcm9wcy5jb29raWVCZWhhdmlvciA/PyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3Iubm9uZSgpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBwcm9wcy5oZWFkZXJCZWhhdmlvciA/PyBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3Iubm9uZSgpO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5ncyA9IHByb3BzLnF1ZXJ5U3RyaW5nQmVoYXZpb3IgPz8gT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3Iubm9uZSgpO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuT3JpZ2luUmVxdWVzdFBvbGljeSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5Q29uZmlnOiB7XG4gICAgICAgIG5hbWU6IG9yaWdpblJlcXVlc3RQb2xpY3lOYW1lLFxuICAgICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50LFxuICAgICAgICBjb29raWVzQ29uZmlnOiB7XG4gICAgICAgICAgY29va2llQmVoYXZpb3I6IGNvb2tpZXMuYmVoYXZpb3IsXG4gICAgICAgICAgY29va2llczogY29va2llcy5jb29raWVzLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzQ29uZmlnOiB7XG4gICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IGhlYWRlcnMuYmVoYXZpb3IsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVycy5oZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBxdWVyeVN0cmluZ3NDb25maWc6IHtcbiAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBxdWVyeVN0cmluZ3MuYmVoYXZpb3IsXG4gICAgICAgICAgcXVlcnlTdHJpbmdzOiBxdWVyeVN0cmluZ3MucXVlcnlTdHJpbmdzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMub3JpZ2luUmVxdWVzdFBvbGljeUlkID0gcmVzb3VyY2UucmVmO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFueSBjb29raWVzIGluIHZpZXdlciByZXF1ZXN0cyAoYW5kIGlmIHNvLCB3aGljaCBjb29raWVzKVxuICogYXJlIGluY2x1ZGVkIGluIHJlcXVlc3RzIHRoYXQgQ2xvdWRGcm9udCBzZW5kcyB0byB0aGUgb3JpZ2luLlxuICovXG5leHBvcnQgY2xhc3MgT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIENvb2tpZXMgaW4gdmlld2VyIHJlcXVlc3RzIGFyZSBub3QgaW5jbHVkZWQgaW4gcmVxdWVzdHMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHRoZSBvcmlnaW4uXG4gICAqIEFueSBjb29raWVzIHRoYXQgYXJlIGxpc3RlZCBpbiBhIENhY2hlUG9saWN5IGFyZSBzdGlsbCBpbmNsdWRlZCBpbiBvcmlnaW4gcmVxdWVzdHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG5vbmUoKSB7IHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yKCdub25lJyk7IH1cblxuICAvKiogQWxsIGNvb2tpZXMgaW4gdmlld2VyIHJlcXVlc3RzIGFyZSBpbmNsdWRlZCBpbiByZXF1ZXN0cyB0aGF0IENsb3VkRnJvbnQgc2VuZHMgdG8gdGhlIG9yaWdpbi4gKi9cbiAgcHVibGljIHN0YXRpYyBhbGwoKSB7IHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yKCdhbGwnKTsgfVxuXG4gIC8qKiBPbmx5IHRoZSBwcm92aWRlZCBgY29va2llc2AgYXJlIGluY2x1ZGVkIGluIHJlcXVlc3RzIHRoYXQgQ2xvdWRGcm9udCBzZW5kcyB0byB0aGUgb3JpZ2luLiAqL1xuICBwdWJsaWMgc3RhdGljIGFsbG93TGlzdCguLi5jb29raWVzOiBzdHJpbmdbXSkge1xuICAgIGlmIChjb29raWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgY29va2llIHRvIGFsbG93IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IoJ3doaXRlbGlzdCcsIGNvb2tpZXMpO1xuICB9XG5cbiAgLyoqIFRoZSBiZWhhdmlvciBvZiBjb29raWVzOiBhbGxvdyBhbGwsIG5vbmUgb3IgYW4gYWxsb3cgbGlzdC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGJlaGF2aW9yOiBzdHJpbmc7XG4gIC8qKiBUaGUgY29va2llcyB0byBhbGxvdywgaWYgdGhlIGJlaGF2aW9yIGlzIGFuIGFsbG93IGxpc3QuICovXG4gIHB1YmxpYyByZWFkb25seSBjb29raWVzPzogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihiZWhhdmlvcjogc3RyaW5nLCBjb29raWVzPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmJlaGF2aW9yID0gYmVoYXZpb3I7XG4gICAgdGhpcy5jb29raWVzID0gY29va2llcztcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbnkgSFRUUCBoZWFkZXJzIChhbmQgaWYgc28sIHdoaWNoIGhlYWRlcnMpIGFyZSBpbmNsdWRlZCBpbiByZXF1ZXN0cyB0aGF0IENsb3VkRnJvbnQgc2VuZHMgdG8gdGhlIG9yaWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBIVFRQIGhlYWRlcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiByZXF1ZXN0cyB0aGF0IENsb3VkRnJvbnQgc2VuZHMgdG8gdGhlIG9yaWdpbi5cbiAgICogQW55IGhlYWRlcnMgdGhhdCBhcmUgbGlzdGVkIGluIGEgQ2FjaGVQb2xpY3kgYXJlIHN0aWxsIGluY2x1ZGVkIGluIG9yaWdpbiByZXF1ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uZSgpIHsgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IoJ25vbmUnKTsgfVxuXG4gIC8qKlxuICAgKiBBbGwgSFRUUCBoZWFkZXJzIGluIHZpZXdlciByZXF1ZXN0cyBhcmUgaW5jbHVkZWQgaW4gcmVxdWVzdHMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHRoZSBvcmlnaW4uXG4gICAqIEFkZGl0aW9uYWxseSwgYW55IGFkZGl0aW9uYWwgQ2xvdWRGcm9udCBoZWFkZXJzIHByb3ZpZGVkIGFyZSBpbmNsdWRlZDsgdGhlIGFkZGl0aW9uYWwgaGVhZGVycyBhcmUgYWRkZWQgYnkgQ2xvdWRGcm9udC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctY2xvdWRmcm9udC1oZWFkZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsKC4uLmNsb3VkZnJvbnRIZWFkZXJzOiBzdHJpbmdbXSkge1xuICAgIGlmIChjbG91ZGZyb250SGVhZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIWNsb3VkZnJvbnRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiBoZWFkZXIuc3RhcnRzV2l0aCgnQ2xvdWRGcm9udC0nKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRpdGlvbmFsIENsb3VkRnJvbnQgaGVhZGVycyBwYXNzZWQgdG8gYE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5hbGwoKWAgbXVzdCBiZWdpbiB3aXRoIFxcJ0Nsb3VkRnJvbnQtXFwnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvcignYWxsVmlld2VyQW5kV2hpdGVsaXN0Q2xvdWRGcm9udCcsIGNsb3VkZnJvbnRIZWFkZXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IoJ2FsbFZpZXdlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMaXN0ZWQgaGVhZGVycyBhcmUgaW5jbHVkZWQgaW4gcmVxdWVzdHMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHRoZSBvcmlnaW4uICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dMaXN0KC4uLmhlYWRlcnM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKGhlYWRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSBoZWFkZXIgdG8gYWxsb3cgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBpZiAoaGVhZGVycy5tYXAoaGVhZGVyID0+IGhlYWRlci50b0xvd2VyQ2FzZSgpKS5zb21lKGhlYWRlciA9PiBbJ2F1dGhvcml6YXRpb24nLCAnYWNjZXB0LWVuY29kaW5nJ10uaW5jbHVkZXMoaGVhZGVyKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigneW91IGNhbm5vdCBwYXNzIGBBdXRob3JpemF0aW9uYCBvciBgQWNjZXB0LUVuY29kaW5nYCBhcyBoZWFkZXIgdmFsdWVzOyB1c2UgYSBDYWNoZVBvbGljeSB0byBmb3J3YXJkIHRoZXNlIGhlYWRlcnMgaW5zdGVhZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvcignd2hpdGVsaXN0JywgaGVhZGVycyk7XG4gIH1cblxuICAvKiogVGhlIGJlaGF2aW9yIG9mIGhlYWRlcnM6IGFsbG93IGFsbCwgbm9uZSBvciBhbiBhbGxvdyBsaXN0LiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmVoYXZpb3I6IHN0cmluZztcbiAgLyoqIFRoZSBoZWFkZXJzIGZvciB0aGUgYWxsb3cgbGlzdCBvciB0aGUgaW5jbHVkZWQgQ2xvdWRGcm9udCBoZWFkZXJzLCBpZiBhcHBsaWNhYmxlLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVhZGVycz86IHN0cmluZ1tdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYmVoYXZpb3I6IHN0cmluZywgaGVhZGVycz86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5iZWhhdmlvciA9IGJlaGF2aW9yO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW55IFVSTCBxdWVyeSBzdHJpbmdzIGluIHZpZXdlciByZXF1ZXN0cyAoYW5kIGlmIHNvLCB3aGljaCBxdWVyeSBzdHJpbmdzKVxuICogYXJlIGluY2x1ZGVkIGluIHJlcXVlc3RzIHRoYXQgQ2xvdWRGcm9udCBzZW5kcyB0byB0aGUgb3JpZ2luLlxuICovXG5leHBvcnQgY2xhc3MgT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3Ige1xuICAvKipcbiAgICogUXVlcnkgc3RyaW5ncyBpbiB2aWV3ZXIgcmVxdWVzdHMgYXJlIG5vdCBpbmNsdWRlZCBpbiByZXF1ZXN0cyB0aGF0IENsb3VkRnJvbnQgc2VuZHMgdG8gdGhlIG9yaWdpbi5cbiAgICogQW55IHF1ZXJ5IHN0cmluZ3MgdGhhdCBhcmUgbGlzdGVkIGluIGEgQ2FjaGVQb2xpY3kgYXJlIHN0aWxsIGluY2x1ZGVkIGluIG9yaWdpbiByZXF1ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uZSgpIHsgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvcignbm9uZScpOyB9XG5cbiAgLyoqIEFsbCBxdWVyeSBzdHJpbmdzIGluIHZpZXdlciByZXF1ZXN0cyBhcmUgaW5jbHVkZWQgaW4gcmVxdWVzdHMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHRoZSBvcmlnaW4uICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsKCkgeyByZXR1cm4gbmV3IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yKCdhbGwnKTsgfVxuXG4gIC8qKiBPbmx5IHRoZSBwcm92aWRlZCBgcXVlcnlTdHJpbmdzYCBhcmUgaW5jbHVkZWQgaW4gcmVxdWVzdHMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHRoZSBvcmlnaW4uICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsb3dMaXN0KC4uLnF1ZXJ5U3RyaW5nczogc3RyaW5nW10pIHtcbiAgICBpZiAocXVlcnlTdHJpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgcXVlcnkgc3RyaW5nIHRvIGFsbG93IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvcignd2hpdGVsaXN0JywgcXVlcnlTdHJpbmdzKTtcbiAgfVxuXG4gIC8qKiBUaGUgYmVoYXZpb3Igb2YgcXVlcnkgc3RyaW5ncyAtLSBhbGxvdyBhbGwsIG5vbmUsIG9yIG9ubHkgYW4gYWxsb3cgbGlzdC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGJlaGF2aW9yOiBzdHJpbmc7XG4gIC8qKiBUaGUgcXVlcnkgc3RyaW5ncyB0byBhbGxvdywgaWYgdGhlIGJlaGF2aW9yIGlzIGFuIGFsbG93IGxpc3QuICovXG4gIHB1YmxpYyByZWFkb25seSBxdWVyeVN0cmluZ3M/OiBzdHJpbmdbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJlaGF2aW9yOiBzdHJpbmcsIHF1ZXJ5U3RyaW5ncz86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5iZWhhdmlvciA9IGJlaGF2aW9yO1xuICAgIHRoaXMucXVlcnlTdHJpbmdzID0gcXVlcnlTdHJpbmdzO1xuICB9XG59XG4iXX0= |
\ | No newline at end of file |