testcafe 2.3.1 → 2.6.1
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 +150 -0
- package/LICENSE +1 -1
- package/README.md +40 -46
- package/bin/testcafe-with-v8-flag-filter.js +10 -16
- package/lib/api/exportable-lib/index.js +1 -11
- package/lib/api/structure/test.js +4 -11
- package/lib/api/test-controller/execution-context.js +4 -2
- package/lib/api/test-controller/index.js +8 -10
- package/lib/api/test-run-tracker.js +1 -1
- package/lib/assertions/executor.js +2 -11
- package/lib/browser/connection/gateway/index.js +272 -0
- package/lib/browser/connection/gateway/status.js +10 -0
- package/lib/browser/connection/index.js +60 -47
- package/lib/browser/connection/service-routes.js +4 -2
- package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +3 -2
- package/lib/browser/provider/built-in/dedicated/chrome/index.js +48 -23
- package/lib/browser/provider/built-in/dedicated/edge/index.js +4 -1
- package/lib/browser/provider/index.js +13 -4
- package/lib/browser/provider/plugin-host.js +7 -1
- package/lib/cli/argument-parser/index.js +10 -16
- package/lib/cli/cli.js +4 -13
- package/lib/cli/remotes-wizard.js +2 -1
- package/lib/cli/utils/should-move-option-to-end.js +17 -0
- package/lib/client/automation/deps/hammerhead.js +24 -0
- package/lib/client/automation/deps/testcafe-core.js +24 -0
- package/lib/client/automation/index.js +567 -187
- package/lib/client/automation/index.min.js +1 -1
- package/lib/client/automation/playback/press/get-key-info.js +44 -0
- package/lib/client/automation/playback/press/utils.js +142 -0
- package/lib/client/automation/utils/get-key-code.js +15 -0
- package/lib/client/automation/utils/get-key-identifier.js +14 -0
- package/lib/client/automation/utils/is-letter.js +7 -0
- package/lib/client/automation/utils/key-identifier-maps.js +93 -0
- package/lib/client/browser/idle-page/index.html.mustache +2 -2
- package/lib/client/browser/idle-page/index.js +24 -11
- package/lib/client/core/index.js +67 -13
- package/lib/client/core/index.min.js +1 -1
- package/lib/client/core/utils/array.js +77 -0
- package/lib/client/core/utils/dom.js +459 -0
- package/lib/client/core/utils/send-request-to-frame.js +22 -0
- package/lib/client/core/utils/style.js +102 -0
- package/lib/client/core/utils/values/boundary-values.js +41 -0
- package/lib/client/driver/index.js +270 -242
- package/lib/client/driver/index.min.js +1 -1
- package/lib/client/test-run/iframe.js.mustache +6 -6
- package/lib/client/test-run/index.js.mustache +37 -33
- package/lib/client/ui/index.js +3238 -54
- package/lib/client/ui/index.min.js +1 -1
- package/lib/client/ui/sprite.svg +15 -0
- package/lib/client/ui/styles.css +184 -41
- package/lib/compiler/babel/load-libs.js +6 -6
- package/lib/compiler/compilers.js +7 -7
- package/lib/compiler/index.js +6 -6
- package/lib/compiler/interfaces.js +1 -1
- package/lib/compiler/test-file/add-export-api.js +3 -3
- package/lib/compiler/test-file/api-based.js +8 -37
- package/lib/compiler/test-file/formats/es-next/compiler.js +5 -5
- package/lib/compiler/test-file/formats/typescript/compiler.js +9 -9
- package/lib/compiler/test-file/get-exportable-lib-path.js +3 -3
- package/lib/configuration/configuration-base.js +9 -6
- package/lib/configuration/default-values.js +3 -3
- package/lib/configuration/formats.js +9 -5
- package/lib/configuration/interfaces.js +1 -1
- package/lib/configuration/option-names.js +3 -4
- package/lib/configuration/run-option-names.js +2 -2
- package/lib/configuration/testcafe-configuration.js +41 -24
- package/lib/configuration/types.js +1 -1
- package/lib/configuration/utils.js +32 -0
- package/lib/custom-client-scripts/client-script.js +2 -2
- package/lib/custom-client-scripts/get-code.js +3 -3
- package/lib/custom-client-scripts/routing.js +10 -12
- package/lib/errors/runtime/templates.js +3 -2
- package/lib/errors/test-run/templates.js +4 -1
- package/lib/errors/types.js +3 -1
- package/lib/index.js +6 -31
- package/lib/live/bootstrapper.js +3 -3
- package/lib/live/test-runner.js +9 -7
- package/lib/native-automation/add-custom-debug-formatters.js +23 -0
- package/lib/native-automation/api-base.js +27 -0
- package/lib/native-automation/client/event-descriptor.js +118 -0
- package/lib/native-automation/client/input.js +46 -0
- package/lib/native-automation/client/key-press/utils.js +31 -0
- package/lib/native-automation/client/types.js +11 -0
- package/lib/native-automation/client/utils.js +54 -0
- package/lib/native-automation/cookie-provider.js +115 -0
- package/lib/native-automation/empty-page-markup.js +11 -0
- package/lib/native-automation/error-route.js +7 -0
- package/lib/native-automation/errors.js +20 -0
- package/lib/native-automation/index.js +53 -0
- package/lib/native-automation/request-hooks/event-factory/frame-navigated-event-based.js +40 -0
- package/lib/native-automation/request-hooks/event-factory/request-paused-event-based.js +94 -0
- package/lib/native-automation/request-hooks/event-provider.js +55 -0
- package/lib/native-automation/request-hooks/pipeline-context.js +11 -0
- package/lib/{proxyless → native-automation}/request-pipeline/constants.js +1 -1
- package/lib/native-automation/request-pipeline/context-info.js +58 -0
- package/lib/native-automation/request-pipeline/index.js +329 -0
- package/lib/native-automation/request-pipeline/resendAuthRequest.js +23 -0
- package/lib/native-automation/request-pipeline/safe-api.js +66 -0
- package/lib/native-automation/request-pipeline/special-handlers.js +76 -0
- package/lib/native-automation/request-pipeline/test-run-bridge.js +45 -0
- package/lib/native-automation/resource-injector.js +175 -0
- package/lib/native-automation/session-storage/index.js +43 -0
- package/lib/native-automation/storages-provider.js +17 -0
- package/lib/native-automation/types.js +12 -0
- package/lib/native-automation/utils/cdp.js +71 -0
- package/lib/native-automation/utils/convert.js +11 -0
- package/lib/native-automation/utils/get-active-client.js +8 -0
- package/lib/native-automation/utils/headers.js +30 -0
- package/lib/native-automation/utils/string.js +32 -0
- package/lib/reporter/index.js +52 -4
- package/lib/reporter/interfaces.js +1 -1
- package/lib/reporter/plugin-host.js +44 -4
- package/lib/reporter/plugin-methods.js +2 -1
- package/lib/reporter/report-data-log.js +25 -0
- package/lib/role/role.js +4 -39
- package/lib/runner/bootstrapper.js +40 -15
- package/lib/runner/browser-job.js +4 -5
- package/lib/runner/fixture-hook-controller.js +1 -7
- package/lib/runner/index.js +87 -94
- package/lib/runner/interfaces.js +1 -1
- package/lib/runner/task/index.js +2 -32
- package/lib/runner/test-run-controller.js +46 -4
- package/lib/shared/errors/index.js +8 -2
- package/lib/shared/utils/is-file-protocol.js +2 -2
- package/lib/test-run/bookmark.js +5 -23
- package/lib/test-run/commands/actions.js +16 -4
- package/lib/test-run/commands/service.js +2 -3
- package/lib/test-run/commands/type.js +2 -1
- package/lib/test-run/commands/utils.js +4 -2
- package/lib/test-run/cookies/base.js +4 -1
- package/lib/test-run/cookies/factory.js +4 -4
- package/lib/test-run/cookies/provider.js +9 -2
- package/lib/test-run/execute-js-expression/index.js +4 -2
- package/lib/test-run/index.js +35 -151
- package/lib/test-run/request/create-request-options.js +37 -24
- package/lib/test-run/request/send.js +2 -3
- package/lib/test-run/role-provider.js +5 -5
- package/lib/test-run/session-controller.js +5 -5
- package/lib/test-run/storages/factory.js +4 -4
- package/lib/testcafe.js +17 -18
- package/lib/utils/check-is-vm.js +58 -0
- package/lib/utils/debug-loggers.js +9 -7
- package/lib/utils/get-browser.js +5 -2
- package/lib/utils/get-options/boolean-or-object-option.js +18 -0
- package/lib/utils/get-options/quarantine.js +10 -13
- package/lib/utils/get-options/skip-js-errors.js +12 -16
- package/lib/utils/parse-user-agent.js +20 -13
- package/lib/utils/string.js +1 -1
- package/package.json +14 -11
- package/ts-defs/index.d.ts +12 -2
- package/ts-defs/selectors.d.ts +8 -1
- package/ts-defs/testcafe-scripts.d.ts +8 -1
- package/lib/browser/connection/gateway.js +0 -205
- package/lib/compiler/test-file/test-file-temp-variable-name.js +0 -6
- package/lib/dashboard/config-storage.js +0 -26
- package/lib/dashboard/connector.js +0 -84
- package/lib/dashboard/documentation-url.js +0 -6
- package/lib/dashboard/formatting.js +0 -26
- package/lib/dashboard/get-dashboard-url.js +0 -10
- package/lib/dashboard/get-default-project-link.js +0 -23
- package/lib/dashboard/get-env-options.js +0 -26
- package/lib/dashboard/index.js +0 -145
- package/lib/dashboard/interfaces.js +0 -3
- package/lib/dashboard/messages.js +0 -21
- package/lib/proxyless/add-custom-debug-formatters.js +0 -22
- package/lib/proxyless/api-base.js +0 -25
- package/lib/proxyless/client/event-simulator.js +0 -40
- package/lib/proxyless/client/types.js +0 -11
- package/lib/proxyless/client/utils.js +0 -24
- package/lib/proxyless/cookie-provider.js +0 -87
- package/lib/proxyless/default-setup-options.js +0 -9
- package/lib/proxyless/empty-page-markup.js +0 -11
- package/lib/proxyless/error-route.js +0 -7
- package/lib/proxyless/index.js +0 -53
- package/lib/proxyless/request-hooks/event-factory/frame-navigated-event-based.js +0 -40
- package/lib/proxyless/request-hooks/event-factory/request-paused-event-based.js +0 -95
- package/lib/proxyless/request-hooks/event-provider.js +0 -52
- package/lib/proxyless/request-hooks/pipeline-context.js +0 -11
- package/lib/proxyless/request-pipeline/context-info.js +0 -55
- package/lib/proxyless/request-pipeline/index.js +0 -230
- package/lib/proxyless/request-pipeline/resendAuthRequest.js +0 -23
- package/lib/proxyless/request-pipeline/safe-api.js +0 -62
- package/lib/proxyless/request-pipeline/special-handlers.js +0 -73
- package/lib/proxyless/request-pipeline/test-run-bridge.js +0 -45
- package/lib/proxyless/resource-injector.js +0 -162
- package/lib/proxyless/session-storage/index.js +0 -39
- package/lib/proxyless/storages-provider.js +0 -17
- package/lib/proxyless/types.js +0 -10
- package/lib/proxyless/utils/cdp.js +0 -66
- package/lib/proxyless/utils/get-active-client.js +0 -8
- package/lib/proxyless/utils/headers.js +0 -30
- package/lib/proxyless/utils/string.js +0 -32
- package/lib/services/compiler/esm-runtime-holder-name.js +0 -6
- package/lib/services/compiler/host.js +0 -370
- package/lib/services/compiler/interfaces.js +0 -3
- package/lib/services/compiler/io.js +0 -10
- package/lib/services/compiler/protocol.js +0 -17
- package/lib/services/compiler/service-loader.js +0 -18
- package/lib/services/compiler/service.js +0 -361
- package/lib/services/compiler/test-run-proxy.js +0 -156
- package/lib/services/interfaces.js +0 -3
- package/lib/services/process-title.js +0 -10
- package/lib/services/serialization/prepare-options.js +0 -23
- package/lib/services/serialization/replicator/create-replicator.js +0 -58
- package/lib/services/serialization/replicator/interfaces.js +0 -3
- package/lib/services/serialization/replicator/transforms/base-transform.js +0 -16
- package/lib/services/serialization/replicator/transforms/browser-console-messages-transform.js +0 -23
- package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +0 -24
- package/lib/services/serialization/replicator/transforms/command-base-trasform/assertion-command-constructors.js +0 -28
- package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +0 -66
- package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +0 -49
- package/lib/services/serialization/replicator/transforms/command-base-trasform/types.js +0 -3
- package/lib/services/serialization/replicator/transforms/configure-response-event-option-transform.js +0 -21
- package/lib/services/serialization/replicator/transforms/custom-error-transform.js +0 -29
- package/lib/services/serialization/replicator/transforms/function-marker-transform/index.js +0 -21
- package/lib/services/serialization/replicator/transforms/function-marker-transform/marker.js +0 -9
- package/lib/services/serialization/replicator/transforms/promise-marker-transform/index.js +0 -21
- package/lib/services/serialization/replicator/transforms/promise-marker-transform/marker.js +0 -9
- package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +0 -22
- package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/index.js +0 -22
- package/lib/services/serialization/replicator/transforms/re-executable-promise-transform/marker.js +0 -6
- package/lib/services/serialization/replicator/transforms/request-filter-rule-transform.js +0 -23
- package/lib/services/serialization/replicator/transforms/request-hook-event-data-transform.js +0 -41
- package/lib/services/serialization/replicator/transforms/response-mock-transform.js +0 -23
- package/lib/services/serialization/replicator/transforms/role-transform.js +0 -21
- package/lib/services/serialization/replicator/transforms/testcafe-error-list-transform.js +0 -23
- package/lib/services/serialization/replicator/transforms/url-transform.js +0 -23
- package/lib/services/serialization/test-structure.js +0 -91
- package/lib/services/utils/ipc/interfaces.js +0 -29
- package/lib/services/utils/ipc/io.js +0 -109
- package/lib/services/utils/ipc/message.js +0 -84
- package/lib/services/utils/ipc/packet.js +0 -57
- package/lib/services/utils/ipc/proxy.js +0 -94
- package/lib/services/utils/ipc/transport.js +0 -65
- package/lib/services/utils/method-should-not-be-called-error.js +0 -10
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const lodash_1 = require("lodash");
|
|
7
|
+
const event_provider_1 = __importDefault(require("../request-hooks/event-provider"));
|
|
8
|
+
const resource_injector_1 = __importDefault(require("../resource-injector"));
|
|
9
|
+
const headers_1 = require("../utils/headers");
|
|
10
|
+
const cdp_1 = require("../utils/cdp");
|
|
11
|
+
const error_route_1 = __importDefault(require("../error-route"));
|
|
12
|
+
const debug_loggers_1 = require("../../utils/debug-loggers");
|
|
13
|
+
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
|
14
|
+
const special_handlers_1 = __importDefault(require("./special-handlers"));
|
|
15
|
+
const safe_api_1 = require("./safe-api");
|
|
16
|
+
const api_base_1 = __importDefault(require("../api-base"));
|
|
17
|
+
const resendAuthRequest_1 = require("./resendAuthRequest");
|
|
18
|
+
const test_run_bridge_1 = __importDefault(require("./test-run-bridge"));
|
|
19
|
+
const context_info_1 = __importDefault(require("./context-info"));
|
|
20
|
+
const errors_1 = require("../errors");
|
|
21
|
+
const ALL_REQUEST_RESPONSES = { requestStage: 'Request' };
|
|
22
|
+
const ALL_REQUEST_REQUESTS = { requestStage: 'Response' };
|
|
23
|
+
const ALL_REQUESTS_DATA = [ALL_REQUEST_REQUESTS, ALL_REQUEST_RESPONSES];
|
|
24
|
+
class NativeAutomationRequestPipeline extends api_base_1.default {
|
|
25
|
+
constructor(browserId, client, options) {
|
|
26
|
+
super(browserId, client, options);
|
|
27
|
+
this._testRunBridge = new test_run_bridge_1.default(browserId);
|
|
28
|
+
this._contextInfo = new context_info_1.default(this._testRunBridge);
|
|
29
|
+
this._specialServiceRoutes = this._getSpecialServiceRoutes();
|
|
30
|
+
this.requestHookEventProvider = new event_provider_1.default();
|
|
31
|
+
this._resourceInjector = new resource_injector_1.default(this._testRunBridge);
|
|
32
|
+
this._stopped = false;
|
|
33
|
+
this._currentFrameTree = null;
|
|
34
|
+
this._failedRequestIds = [];
|
|
35
|
+
this.restoringStorages = null;
|
|
36
|
+
this.contextStorage = null;
|
|
37
|
+
this._pendingCertificateError = null;
|
|
38
|
+
this._setOptionsForResourceInjector();
|
|
39
|
+
}
|
|
40
|
+
_setOptionsForResourceInjector() {
|
|
41
|
+
const options = this._createResourceInjectorOptions();
|
|
42
|
+
this._resourceInjector.setOptions(options);
|
|
43
|
+
}
|
|
44
|
+
_createResourceInjectorOptions() {
|
|
45
|
+
return {
|
|
46
|
+
specialServiceRoutes: this._specialServiceRoutes,
|
|
47
|
+
developmentMode: this.options.developmentMode,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
_getSpecialServiceRoutes() {
|
|
51
|
+
const browserConnection = this._testRunBridge.getBrowserConnection();
|
|
52
|
+
const proxy = browserConnection.browserConnectionGateway.proxy;
|
|
53
|
+
return {
|
|
54
|
+
errorPage1: proxy.resolveRelativeServiceUrl(error_route_1.default, proxy.server1Info.domain),
|
|
55
|
+
errorPage2: proxy.resolveRelativeServiceUrl(error_route_1.default, proxy.server2Info.domain),
|
|
56
|
+
idlePage: browserConnection.idleUrl,
|
|
57
|
+
openFileProtocolUrl: browserConnection.openFileProtocolUrl,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async _handleMockErrorIfNecessary(pipelineContext, event) {
|
|
61
|
+
if (!pipelineContext.mock.hasError)
|
|
62
|
+
return;
|
|
63
|
+
await pipelineContext.handleMockError(this.requestHookEventProvider);
|
|
64
|
+
(0, debug_loggers_1.requestPipelineMockLogger)('%s\n%s', event.networkId, pipelineContext.mock.error);
|
|
65
|
+
}
|
|
66
|
+
async _handleMockResponse(mockedResponse, pipelineContext, event, sessionId) {
|
|
67
|
+
if (this._stopped)
|
|
68
|
+
return;
|
|
69
|
+
const mockedResponseBodyStr = mockedResponse.getBody().toString();
|
|
70
|
+
const fulfillInfo = {
|
|
71
|
+
requestId: event.requestId,
|
|
72
|
+
responseCode: mockedResponse.statusCode,
|
|
73
|
+
responseHeaders: (0, headers_1.convertToHeaderEntries)(mockedResponse.headers),
|
|
74
|
+
body: mockedResponseBodyStr,
|
|
75
|
+
};
|
|
76
|
+
if (pipelineContext.reqOpts.isAjax)
|
|
77
|
+
await this._resourceInjector.processNonProxiedContent(fulfillInfo, this._client, sessionId);
|
|
78
|
+
else {
|
|
79
|
+
await this._resourceInjector.processHTMLPageContent(fulfillInfo, {
|
|
80
|
+
isIframe: false,
|
|
81
|
+
contextStorage: this.contextStorage,
|
|
82
|
+
}, this._client, sessionId);
|
|
83
|
+
}
|
|
84
|
+
(0, debug_loggers_1.requestPipelineMockLogger)(`sent mocked response for the ${event.requestId}`);
|
|
85
|
+
}
|
|
86
|
+
_createContinueResponseRequest(event, modified) {
|
|
87
|
+
const continueResponseRequest = {
|
|
88
|
+
requestId: event.requestId,
|
|
89
|
+
};
|
|
90
|
+
if (modified) {
|
|
91
|
+
continueResponseRequest.responseHeaders = event.responseHeaders;
|
|
92
|
+
continueResponseRequest.responseCode = event.responseStatusCode;
|
|
93
|
+
}
|
|
94
|
+
return continueResponseRequest;
|
|
95
|
+
}
|
|
96
|
+
_shouldRedirectToErrorPage(event) {
|
|
97
|
+
return event.resourceType === 'Document'
|
|
98
|
+
&& !this._isIframe(event.frameId);
|
|
99
|
+
}
|
|
100
|
+
async _getUserScripts(event) {
|
|
101
|
+
const { pipelineContext, eventFactory } = this._contextInfo.getContextData(event);
|
|
102
|
+
await pipelineContext.prepareInjectableUserScripts(eventFactory, this._testRunBridge.getUserScripts());
|
|
103
|
+
return pipelineContext.injectableUserScripts;
|
|
104
|
+
}
|
|
105
|
+
async _respondToOtherRequest(event, sessionId) {
|
|
106
|
+
if ((0, testcafe_hammerhead_1.isRedirectStatusCode)(event.responseStatusCode)) {
|
|
107
|
+
await (0, safe_api_1.safeContinueResponse)(this._client, { requestId: event.requestId }, sessionId);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const resourceInfo = await this._resourceInjector.getDocumentResourceInfo(event, this._client);
|
|
111
|
+
if (resourceInfo.error) {
|
|
112
|
+
if (this._shouldRedirectToErrorPage(event)) {
|
|
113
|
+
await this._resourceInjector.redirectToErrorPage(this._client, resourceInfo.error, event.request.url);
|
|
114
|
+
this._contextInfo.dispose((0, cdp_1.getRequestId)(event));
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const modified = await this.requestHookEventProvider.onResponse(event, resourceInfo.body, this._contextInfo, this._client);
|
|
119
|
+
if (this._needInjectResources(event)) {
|
|
120
|
+
const fulfillInfo = {
|
|
121
|
+
requestId: event.requestId,
|
|
122
|
+
responseHeaders: event.responseHeaders,
|
|
123
|
+
responseCode: event.responseStatusCode,
|
|
124
|
+
body: resourceInfo.body.toString(),
|
|
125
|
+
};
|
|
126
|
+
// NOTE: Strange behavior of the CDP API:
|
|
127
|
+
// if we pass the empty "responseStatusText" value, we get an error 'Invalid status code or phrase'.
|
|
128
|
+
if (event.responseStatusText !== '')
|
|
129
|
+
fulfillInfo.responsePhrase = event.responseStatusText;
|
|
130
|
+
if ((0, cdp_1.isUnauthorized)(event.responseStatusCode))
|
|
131
|
+
await this._tryAuthorizeWithHttpBasicAuthCredentials(event, fulfillInfo);
|
|
132
|
+
const userScripts = await this._getUserScripts(event);
|
|
133
|
+
await this._resourceInjector.processHTMLPageContent(fulfillInfo, {
|
|
134
|
+
isIframe: this._isIframe(event.frameId),
|
|
135
|
+
url: event.request.url,
|
|
136
|
+
restoringStorages: this.restoringStorages,
|
|
137
|
+
contextStorage: this.contextStorage,
|
|
138
|
+
userScripts,
|
|
139
|
+
}, this._client, sessionId);
|
|
140
|
+
this._contextInfo.dispose((0, cdp_1.getRequestId)(event));
|
|
141
|
+
this.restoringStorages = null;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const continueResponseRequest = this._createContinueResponseRequest(event, modified);
|
|
145
|
+
await (0, safe_api_1.safeContinueResponse)(this._client, continueResponseRequest, sessionId);
|
|
146
|
+
this._contextInfo.dispose((0, cdp_1.getRequestId)(event));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
_needInjectResources(event) {
|
|
150
|
+
var _a, _b;
|
|
151
|
+
if (event.resourceType !== 'Document')
|
|
152
|
+
return false;
|
|
153
|
+
const contentType = (_b = (_a = event.responseHeaders) === null || _a === void 0 ? void 0 : _a.find(header => header.name.toLowerCase() === 'content-type')) === null || _b === void 0 ? void 0 : _b.value;
|
|
154
|
+
if (contentType)
|
|
155
|
+
return testcafe_hammerhead_1.contentTypeUtils.isPage(contentType);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
async _tryAuthorizeWithHttpBasicAuthCredentials(event, fulfillInfo) {
|
|
159
|
+
const credentials = this._testRun.getAuthCredentials();
|
|
160
|
+
if (!credentials)
|
|
161
|
+
return;
|
|
162
|
+
const authRequest = await (0, resendAuthRequest_1.resendAuthRequest)(event.request, credentials);
|
|
163
|
+
if (typeof authRequest !== 'string' && !(0, cdp_1.isUnauthorized)(authRequest.status)) {
|
|
164
|
+
fulfillInfo.responseCode = authRequest.status;
|
|
165
|
+
fulfillInfo.body = authRequest.body.toString();
|
|
166
|
+
fulfillInfo.responsePhrase = authRequest.statusText;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
_createError(event) {
|
|
170
|
+
if (this._pendingCertificateError)
|
|
171
|
+
return (0, errors_1.sslCertificateError)(this._pendingCertificateError.errorType);
|
|
172
|
+
if (event.responseErrorReason === 'NameNotResolved')
|
|
173
|
+
return (0, errors_1.failedToFindDNSError)(event.request.url);
|
|
174
|
+
return new Error(event.responseErrorReason);
|
|
175
|
+
}
|
|
176
|
+
async _tryRespondToOtherRequest(event, sessionId) {
|
|
177
|
+
try {
|
|
178
|
+
if (event.responseErrorReason && this._shouldRedirectToErrorPage(event)) {
|
|
179
|
+
const error = this._createError(event);
|
|
180
|
+
await this._resourceInjector.redirectToErrorPage(this._client, error, event.request.url);
|
|
181
|
+
}
|
|
182
|
+
else
|
|
183
|
+
await this._respondToOtherRequest(event, sessionId);
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
if (event.networkId && this._failedRequestIds.includes(event.networkId)) {
|
|
187
|
+
(0, lodash_1.remove)(this._failedRequestIds, event.networkId);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async _handleOtherRequests(event, sessionId) {
|
|
194
|
+
(0, debug_loggers_1.requestPipelineOtherRequestLogger)('%r', event);
|
|
195
|
+
if (!event.responseErrorReason && ((0, cdp_1.isRequest)(event) || (0, testcafe_hammerhead_1.isRedirectStatusCode)(event.responseStatusCode))) {
|
|
196
|
+
this._contextInfo.init(event);
|
|
197
|
+
await this.requestHookEventProvider.onRequest(event, this._contextInfo);
|
|
198
|
+
const pipelineContext = this._contextInfo.getPipelineContext((0, cdp_1.getRequestId)(event));
|
|
199
|
+
if (!pipelineContext || !pipelineContext.mock)
|
|
200
|
+
await (0, safe_api_1.safeContinueRequest)(this._client, event, sessionId, this._createContinueEventArgs(event, pipelineContext.reqOpts));
|
|
201
|
+
else {
|
|
202
|
+
(0, debug_loggers_1.requestPipelineMockLogger)('begin mocking request %r', event);
|
|
203
|
+
const mockedResponse = await pipelineContext.getMockResponse();
|
|
204
|
+
await this._handleMockErrorIfNecessary(pipelineContext, event);
|
|
205
|
+
const mockedResponseEvent = (0, cdp_1.createRequestPausedEventForResponse)(mockedResponse, event);
|
|
206
|
+
await this.requestHookEventProvider.onResponse(mockedResponseEvent, mockedResponse.getBody(), this._contextInfo, this._client);
|
|
207
|
+
await this._handleMockResponse(mockedResponse, pipelineContext, event, sessionId);
|
|
208
|
+
this._contextInfo.dispose((0, cdp_1.getRequestId)(event));
|
|
209
|
+
(0, debug_loggers_1.requestPipelineMockLogger)('end mocking request %r', event);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else
|
|
213
|
+
await this._tryRespondToOtherRequest(event, sessionId);
|
|
214
|
+
}
|
|
215
|
+
_getUploadPostData(event) {
|
|
216
|
+
if (!event.request.postData)
|
|
217
|
+
return void 0;
|
|
218
|
+
const contentTypeHeader = event.request.headers['Content-Type'];
|
|
219
|
+
const postData = Buffer.from(event.request.postData, 'utf-8');
|
|
220
|
+
const bodyWithUploads = (0, testcafe_hammerhead_1.injectUpload)(contentTypeHeader, postData);
|
|
221
|
+
return bodyWithUploads ? bodyWithUploads.toString('base64') : void 0;
|
|
222
|
+
}
|
|
223
|
+
_topFrameNavigation(event) {
|
|
224
|
+
return event.type === 'Navigation'
|
|
225
|
+
&& !event.frame.parentId;
|
|
226
|
+
}
|
|
227
|
+
async _updateCurrentFrameTree() {
|
|
228
|
+
// NOTE: Due to CDP restrictions (it hangs), we can't get the frame tree
|
|
229
|
+
// right before injecting service scripts.
|
|
230
|
+
// So, we are forced tracking frames tree.
|
|
231
|
+
const result = await this._client.Page.getFrameTree();
|
|
232
|
+
this._currentFrameTree = result.frameTree;
|
|
233
|
+
}
|
|
234
|
+
_isIframe(frameId) {
|
|
235
|
+
if (!this._currentFrameTree)
|
|
236
|
+
return false;
|
|
237
|
+
return this._currentFrameTree.frame.id !== frameId;
|
|
238
|
+
}
|
|
239
|
+
async start() {
|
|
240
|
+
// NOTE: We are forced to handle all requests and responses at once
|
|
241
|
+
// because CDP API does not allow specifying request filtering behavior for different handlers.
|
|
242
|
+
await this._client.Fetch.enable({
|
|
243
|
+
patterns: ALL_REQUESTS_DATA,
|
|
244
|
+
});
|
|
245
|
+
await this._client.Target.setAutoAttach({
|
|
246
|
+
autoAttach: true,
|
|
247
|
+
waitForDebuggerOnStart: true,
|
|
248
|
+
flatten: true,
|
|
249
|
+
});
|
|
250
|
+
// NOTE: We need to enable the Fetch domain for iframe targets
|
|
251
|
+
// to intercept some requests. We need to use the `sessionId` option
|
|
252
|
+
// in continueRequest/continueResponse/fulfillRequest methods
|
|
253
|
+
await this._client.Target.on('attachedToTarget', async (event) => {
|
|
254
|
+
// @ts-ignore
|
|
255
|
+
await this._client.Runtime.runIfWaitingForDebugger(event.sessionId);
|
|
256
|
+
if (event.targetInfo.type !== 'worker')
|
|
257
|
+
// @ts-ignore
|
|
258
|
+
await this._client.Fetch.enable({ patterns: ALL_REQUESTS_DATA }, event.sessionId);
|
|
259
|
+
});
|
|
260
|
+
// @ts-ignore
|
|
261
|
+
this._client.Fetch.on('requestPaused', async (event, sessionId) => {
|
|
262
|
+
if (this._stopped)
|
|
263
|
+
return;
|
|
264
|
+
const specialRequestHandler = (0, special_handlers_1.default)(event, this.options, this._specialServiceRoutes);
|
|
265
|
+
if (specialRequestHandler)
|
|
266
|
+
await specialRequestHandler(event, this._client, this.options, sessionId);
|
|
267
|
+
else
|
|
268
|
+
await this._handleOtherRequests(event, sessionId);
|
|
269
|
+
});
|
|
270
|
+
this._client.Page.on('frameNavigated', async (event) => {
|
|
271
|
+
(0, debug_loggers_1.requestPipelineLogger)('%f', event);
|
|
272
|
+
if (!this._topFrameNavigation(event)
|
|
273
|
+
|| event.frame.url !== testcafe_hammerhead_1.SPECIAL_BLANK_PAGE)
|
|
274
|
+
return;
|
|
275
|
+
this._contextInfo.init(event);
|
|
276
|
+
const userScripts = await this._getUserScripts(event);
|
|
277
|
+
await this._resourceInjector.processAboutBlankPage(event, userScripts, this.contextStorage, this._client);
|
|
278
|
+
this._contextInfo.dispose((0, cdp_1.getRequestId)(event));
|
|
279
|
+
});
|
|
280
|
+
this._client.Page.on('frameStartedLoading', async () => {
|
|
281
|
+
await this._updateCurrentFrameTree();
|
|
282
|
+
});
|
|
283
|
+
this._client.Network.on('loadingFailed', async (event) => {
|
|
284
|
+
(0, debug_loggers_1.requestPipelineLogger)('%l', event);
|
|
285
|
+
this._failedRequestIds.push(event.requestId);
|
|
286
|
+
if (event.requestId)
|
|
287
|
+
this._contextInfo.dispose(event.requestId);
|
|
288
|
+
});
|
|
289
|
+
await this._client.Page.setBypassCSP({ enabled: true });
|
|
290
|
+
await this._client.Security.enable();
|
|
291
|
+
this._client.Security.on('certificateError', async (event) => {
|
|
292
|
+
this._pendingCertificateError = event;
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
stop() {
|
|
296
|
+
this._stopped = true;
|
|
297
|
+
}
|
|
298
|
+
async dispose() {
|
|
299
|
+
await this._client.Fetch.disable();
|
|
300
|
+
}
|
|
301
|
+
_createContinueEventArgs(event, reqOpts) {
|
|
302
|
+
const modifiedUrl = new URL(event.request.url);
|
|
303
|
+
const host = modifiedUrl.host;
|
|
304
|
+
let hostModified = false;
|
|
305
|
+
let portModified = false;
|
|
306
|
+
if (modifiedUrl.hostname !== reqOpts.hostname) {
|
|
307
|
+
modifiedUrl.hostname = reqOpts.hostname;
|
|
308
|
+
hostModified = true;
|
|
309
|
+
}
|
|
310
|
+
if (modifiedUrl.port !== reqOpts.port) {
|
|
311
|
+
modifiedUrl.port = reqOpts.port;
|
|
312
|
+
portModified = true;
|
|
313
|
+
}
|
|
314
|
+
if (host !== reqOpts.host) {
|
|
315
|
+
const { port, hostname } = new URL(reqOpts.protocol + '//' + reqOpts.host);
|
|
316
|
+
if (!hostModified)
|
|
317
|
+
modifiedUrl.hostname = hostname;
|
|
318
|
+
if (!portModified)
|
|
319
|
+
modifiedUrl.port = port;
|
|
320
|
+
}
|
|
321
|
+
const postData = this._getUploadPostData(event);
|
|
322
|
+
const url = modifiedUrl.toString() !== event.request.url ? modifiedUrl.toString() : void 0;
|
|
323
|
+
const method = reqOpts.method;
|
|
324
|
+
return { postData, url, method };
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
exports.default = NativeAutomationRequestPipeline;
|
|
328
|
+
module.exports = exports.default;
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmF0aXZlLWF1dG9tYXRpb24vcmVxdWVzdC1waXBlbGluZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFnQztBQVdoQyxxRkFBdUY7QUFDdkYsNkVBQWlGO0FBQ2pGLDhDQUEwRDtBQUUxRCxzQ0FLc0I7QUFFdEIsaUVBQXlDO0FBU3pDLDZEQUltQztBQUVuQyw2REFPNkI7QUFJN0IsMEVBQTBEO0FBQzFELHlDQUF1RTtBQUN2RSwyREFBa0Q7QUFDbEQsMkRBQXdEO0FBQ3hELHdFQUE4QztBQUM5QyxrRUFBZ0U7QUFDaEUsc0NBQXNFO0FBR3RFLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFvQixDQUFDO0FBQzVFLE1BQU0sb0JBQW9CLEdBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFvQixDQUFDO0FBRTdFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBRXhFLE1BQXFCLCtCQUFnQyxTQUFRLGtCQUF1QjtJQWFoRixZQUFvQixTQUFpQixFQUFFLE1BQW1CLEVBQUUsT0FBb0M7UUFDNUYsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLGNBQWMsR0FBYSxJQUFJLHlCQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBZSxJQUFJLHNCQUFrQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMscUJBQXFCLEdBQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksd0JBQXdDLEVBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsaUJBQWlCLEdBQVUsSUFBSSwyQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVEsR0FBbUIsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBVSxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFVLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQVUsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQWEsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7UUFFckMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVPLDhCQUE4QjtRQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUV0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyw4QkFBOEI7UUFDbEMsT0FBTztZQUNILG9CQUFvQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7WUFDaEQsZUFBZSxFQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZTtTQUNyRCxDQUFDO0lBQ04sQ0FBQztJQUVPLHdCQUF3QjtRQUM1QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBZSxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7UUFFM0UsT0FBTztZQUNILFVBQVUsRUFBVyxLQUFLLENBQUMseUJBQXlCLENBQUMscUJBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMzRixVQUFVLEVBQVcsS0FBSyxDQUFDLHlCQUF5QixDQUFDLHFCQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDM0YsUUFBUSxFQUFhLGlCQUFpQixDQUFDLE9BQU87WUFDOUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsbUJBQW1CO1NBQzdELENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQixDQUFFLGVBQWdELEVBQUUsS0FBeUI7UUFDbEgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUM5QixPQUFPO1FBRVgsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXJFLElBQUEseUNBQXlCLEVBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUFFLGNBQW1DLEVBQUUsZUFBZ0QsRUFBRSxLQUF5QixFQUFFLFNBQW9CO1FBQ3JLLElBQUksSUFBSSxDQUFDLFFBQVE7WUFDYixPQUFPO1FBRVgsTUFBTSxxQkFBcUIsR0FBSSxjQUFjLENBQUMsT0FBTyxFQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFOUUsTUFBTSxXQUFXLEdBQUc7WUFDaEIsU0FBUyxFQUFRLEtBQUssQ0FBQyxTQUFTO1lBQ2hDLFlBQVksRUFBSyxjQUFjLENBQUMsVUFBVTtZQUMxQyxlQUFlLEVBQUUsSUFBQSxnQ0FBc0IsRUFBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQy9ELElBQUksRUFBYSxxQkFBcUI7U0FDekMsQ0FBQztRQUVGLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzlCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzNGO1lBQ0QsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFO2dCQUM3RCxRQUFRLEVBQVEsS0FBSztnQkFDckIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO2FBQ3RDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUEseUNBQXlCLEVBQUMsZ0NBQWdDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFTyw4QkFBOEIsQ0FBRSxLQUF5QixFQUFFLFFBQWlCO1FBQ2hGLE1BQU0sdUJBQXVCLEdBQUc7WUFDNUIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQ0YsQ0FBQztRQUU3QixJQUFJLFFBQVEsRUFBRTtZQUNWLHVCQUF1QixDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ2hFLHVCQUF1QixDQUFDLFlBQVksR0FBTSxLQUFLLENBQUMsa0JBQTRCLENBQUM7U0FDaEY7UUFFRCxPQUFPLHVCQUF1QixDQUFDO0lBQ25DLENBQUM7SUFFTywwQkFBMEIsQ0FBRSxLQUF5QjtRQUN6RCxPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssVUFBVTtlQUNqQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFFLEtBQStDO1FBQzFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEYsTUFBTSxlQUFlLENBQUMsNEJBQTRCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUV2RyxPQUFPLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQztJQUNqRCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFFLEtBQXlCLEVBQUUsU0FBb0I7UUFDakYsSUFBSSxJQUFBLDBDQUFvQixFQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sSUFBQSwrQkFBb0IsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVwRixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9GLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXRHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUEsa0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO1lBRUQsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNILElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sV0FBVyxHQUFHO2dCQUNoQixTQUFTLEVBQVEsS0FBSyxDQUFDLFNBQVM7Z0JBQ2hDLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDdEMsWUFBWSxFQUFLLEtBQUssQ0FBQyxrQkFBNEI7Z0JBQ25ELElBQUksRUFBYyxZQUFZLENBQUMsSUFBZSxDQUFDLFFBQVEsRUFBRTthQUNuQyxDQUFDO1lBRTNCLHlDQUF5QztZQUN6QyxvR0FBb0c7WUFDcEcsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssRUFBRTtnQkFDL0IsV0FBVyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUM7WUFFMUQsSUFBSSxJQUFBLG9CQUFjLEVBQUMsS0FBSyxDQUFDLGtCQUE0QixDQUFDO2dCQUNsRCxNQUFNLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFN0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXRELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixDQUMvQyxXQUFXLEVBQ1g7Z0JBQ0ksUUFBUSxFQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDaEQsR0FBRyxFQUFnQixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7Z0JBQ3BDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3pDLGNBQWMsRUFBSyxJQUFJLENBQUMsY0FBYztnQkFDdEMsV0FBVzthQUNkLEVBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUU3QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFBLGtCQUFZLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQ2pDO2FBQ0k7WUFDRCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFckYsTUFBTSxJQUFBLCtCQUFvQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFN0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDbEQ7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUUsS0FBd0M7O1FBQ2xFLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxVQUFVO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBRWpCLE1BQU0sV0FBVyxHQUFHLE1BQUEsTUFBQSxLQUFLLENBQUMsZUFBZSwwQ0FDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxjQUFjLENBQUMsMENBQzVELEtBQUssQ0FBQztRQUVaLElBQUksV0FBVztZQUNYLE9BQU8sc0NBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMseUNBQXlDLENBQUUsS0FBeUIsRUFBRSxXQUFrQztRQUNsSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFdkQsSUFBSSxDQUFDLFdBQVc7WUFDWixPQUFPO1FBRVgsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLHFDQUFpQixFQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFeEUsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFBLG9CQUFjLEVBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hFLFdBQVcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUM5QyxXQUFXLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0MsV0FBVyxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVPLFlBQVksQ0FBRSxLQUF5QjtRQUMzQyxJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFDN0IsT0FBTyxJQUFBLDRCQUFtQixFQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxpQkFBaUI7WUFDL0MsT0FBTyxJQUFBLDZCQUFvQixFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkQsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUFFLEtBQXlCLEVBQUUsU0FBb0I7UUFDcEYsSUFBSTtZQUNBLElBQUksS0FBSyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFdkMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM1Rjs7Z0JBRUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsT0FBTyxHQUFHLEVBQUU7WUFDUixJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JFLElBQUEsZUFBTSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRWhELE9BQU87YUFDVjtZQUVELE1BQU0sR0FBRyxDQUFDO1NBQ2I7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQixDQUFFLEtBQXlCLEVBQUUsU0FBb0I7UUFDL0UsSUFBQSxpREFBaUMsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUEsZUFBUyxFQUFDLEtBQUssQ0FBQyxJQUFJLElBQUEsMENBQW9CLEVBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRTtZQUNwRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU5QixNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV4RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUEsa0JBQVksRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRWxGLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSTtnQkFDekMsTUFBTSxJQUFBLDhCQUFtQixFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUN4SDtnQkFDRCxJQUFBLHlDQUF5QixFQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUU3RCxNQUFNLGNBQWMsR0FBRyxNQUFNLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFFL0QsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUUvRCxNQUFNLG1CQUFtQixHQUFHLElBQUEseUNBQW1DLEVBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUV2RixNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUUvSCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFbEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBRS9DLElBQUEseUNBQXlCLEVBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDOUQ7U0FDSjs7WUFFRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVPLGtCQUFrQixDQUFFLEtBQXdDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDdkIsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUVsQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBVyxDQUFDO1FBQzFFLE1BQU0sUUFBUSxHQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkUsTUFBTSxlQUFlLEdBQUssSUFBQSxrQ0FBWSxFQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXBFLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU8sbUJBQW1CLENBQUUsS0FBMEI7UUFDbkQsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVk7ZUFDM0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRU8sS0FBSyxDQUFDLHVCQUF1QjtRQUNqQyx3RUFBd0U7UUFDeEUsMENBQTBDO1FBQzFDLDBDQUEwQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXRELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFFTyxTQUFTLENBQUUsT0FBZTtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUN2QixPQUFPLEtBQUssQ0FBQztRQUVqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQztJQUN2RCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDZCxtRUFBbUU7UUFDbkUsK0ZBQStGO1FBQy9GLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLFFBQVEsRUFBRSxpQkFBaUI7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDcEMsVUFBVSxFQUFjLElBQUk7WUFDNUIsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixPQUFPLEVBQWlCLElBQUk7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsOERBQThEO1FBQzlELG9FQUFvRTtRQUNwRSw2REFBNkQ7UUFDN0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFDLEtBQUssRUFBQyxFQUFFO1lBQzNELGFBQWE7WUFDYixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVwRSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0JBQ2xDLGFBQWE7Z0JBQ2IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUYsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBeUIsRUFBRSxTQUFvQixFQUFFLEVBQUU7WUFDN0YsSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFDYixPQUFPO1lBRVgsTUFBTSxxQkFBcUIsR0FBRyxJQUFBLDBCQUF3QixFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBRXhHLElBQUkscUJBQXFCO2dCQUNyQixNQUFNLHFCQUFxQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7O2dCQUUxRSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLEtBQTBCLEVBQUUsRUFBRTtZQUN4RSxJQUFBLHFDQUFxQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQzttQkFDN0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssd0NBQWtCO2dCQUN6QyxPQUFPO1lBRVgsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXRELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBQSxrQkFBWSxFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQXlCLEVBQUUsRUFBRTtZQUN6RSxJQUFBLHFDQUFxQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUU3QyxJQUFJLEtBQUssQ0FBQyxTQUFTO2dCQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVyQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLEtBQTRCLEVBQUUsRUFBRTtZQUNoRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLElBQUk7UUFDUCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU87UUFDaEIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU8sd0JBQXdCLENBQUUsS0FBd0MsRUFBRSxPQUFZO1FBQ3BGLE1BQU0sV0FBVyxHQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUV0QyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQzNDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUN4QyxZQUFZLEdBQVcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDbkMsV0FBVyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFlBQVksR0FBTyxJQUFJLENBQUM7U0FDM0I7UUFFRCxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNFLElBQUksQ0FBQyxZQUFZO2dCQUNiLFdBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBRXBDLElBQUksQ0FBQyxZQUFZO2dCQUNiLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFRLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRyxNQUFNLE1BQU0sR0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRWhDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3JDLENBQUM7Q0FDSjtBQXZhRCxrREF1YUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW1vdmUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUHJvdG9jb2xBcGkgfSBmcm9tICdjaHJvbWUtcmVtb3RlLWludGVyZmFjZSc7XG5pbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IFJlcXVlc3RQYXVzZWRFdmVudCA9IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudDtcbmltcG9ydCBGcmFtZU5hdmlnYXRlZEV2ZW50ID0gUHJvdG9jb2wuUGFnZS5GcmFtZU5hdmlnYXRlZEV2ZW50O1xuaW1wb3J0IExvYWRpbmdGYWlsZWRFdmVudCA9IFByb3RvY29sLk5ldHdvcmsuTG9hZGluZ0ZhaWxlZEV2ZW50O1xuaW1wb3J0IENvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0ID0gUHJvdG9jb2wuRmV0Y2guQ29udGludWVSZXNwb25zZVJlcXVlc3Q7XG5pbXBvcnQgRnJhbWVUcmVlID0gUHJvdG9jb2wuUGFnZS5GcmFtZVRyZWU7XG5pbXBvcnQgRnVsZmlsbFJlcXVlc3RSZXF1ZXN0ID0gUHJvdG9jb2wuRmV0Y2guRnVsZmlsbFJlcXVlc3RSZXF1ZXN0O1xuaW1wb3J0IFJlcXVlc3RQYXR0ZXJuID0gUHJvdG9jb2wuRmV0Y2guUmVxdWVzdFBhdHRlcm47XG5pbXBvcnQgQ2VydGlmaWNhdGVFcnJvckV2ZW50ID0gUHJvdG9jb2wuU2VjdXJpdHkuQ2VydGlmaWNhdGVFcnJvckV2ZW50O1xuaW1wb3J0IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIgZnJvbSAnLi4vcmVxdWVzdC1ob29rcy9ldmVudC1wcm92aWRlcic7XG5pbXBvcnQgUmVzb3VyY2VJbmplY3RvciwgeyBSZXNvdXJjZUluamVjdG9yT3B0aW9ucyB9IGZyb20gJy4uL3Jlc291cmNlLWluamVjdG9yJztcbmltcG9ydCB7IGNvbnZlcnRUb0hlYWRlckVudHJpZXMgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzJztcblxuaW1wb3J0IHtcbiAgICBjcmVhdGVSZXF1ZXN0UGF1c2VkRXZlbnRGb3JSZXNwb25zZSxcbiAgICBnZXRSZXF1ZXN0SWQsXG4gICAgaXNSZXF1ZXN0LFxuICAgIGlzVW5hdXRob3JpemVkLFxufSBmcm9tICcuLi91dGlscy9jZHAnO1xuXG5pbXBvcnQgRVJST1JfUk9VVEUgZnJvbSAnLi4vZXJyb3Itcm91dGUnO1xuXG5pbXBvcnQge1xuICAgIENvbnRpbnVlUmVxdWVzdEFyZ3MsXG4gICAgU2Vzc2lvbklkLFxuICAgIFNlc3Npb25TdG9yYWdlSW5mbyxcbiAgICBTcGVjaWFsU2VydmljZVJvdXRlcyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge1xuICAgIHJlcXVlc3RQaXBlbGluZUxvZ2dlcixcbiAgICByZXF1ZXN0UGlwZWxpbmVNb2NrTG9nZ2VyLFxuICAgIHJlcXVlc3RQaXBlbGluZU90aGVyUmVxdWVzdExvZ2dlcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZGVidWctbG9nZ2Vycyc7XG5cbmltcG9ydCB7XG4gICAgSW5jb21pbmdNZXNzYWdlTGlrZSxcbiAgICBpc1JlZGlyZWN0U3RhdHVzQ29kZSxcbiAgICBTUEVDSUFMX0JMQU5LX1BBR0UsXG4gICAgU3RvcmFnZXNTbmFwc2hvdCxcbiAgICBpbmplY3RVcGxvYWQsXG4gICAgY29udGVudFR5cGVVdGlscyxcbn0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmltcG9ydCBOYXRpdmVBdXRvbWF0aW9uUGlwZWxpbmVDb250ZXh0IGZyb20gJy4uL3JlcXVlc3QtaG9va3MvcGlwZWxpbmUtY29udGV4dCc7XG5pbXBvcnQgeyBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IGdldFNwZWNpYWxSZXF1ZXN0SGFuZGxlciBmcm9tICcuL3NwZWNpYWwtaGFuZGxlcnMnO1xuaW1wb3J0IHsgc2FmZUNvbnRpbnVlUmVxdWVzdCwgc2FmZUNvbnRpbnVlUmVzcG9uc2UgfSBmcm9tICcuL3NhZmUtYXBpJztcbmltcG9ydCBOYXRpdmVBdXRvbWF0aW9uQXBpQmFzZSBmcm9tICcuLi9hcGktYmFzZSc7XG5pbXBvcnQgeyByZXNlbmRBdXRoUmVxdWVzdCB9IGZyb20gJy4vcmVzZW5kQXV0aFJlcXVlc3QnO1xuaW1wb3J0IFRlc3RSdW5CcmlkZ2UgZnJvbSAnLi90ZXN0LXJ1bi1icmlkZ2UnO1xuaW1wb3J0IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0Q29udGV4dEluZm8gZnJvbSAnLi9jb250ZXh0LWluZm8nO1xuaW1wb3J0IHsgZmFpbGVkVG9GaW5kRE5TRXJyb3IsIHNzbENlcnRpZmljYXRlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5cbmNvbnN0IEFMTF9SRVFVRVNUX1JFU1BPTlNFUyA9IHsgcmVxdWVzdFN0YWdlOiAnUmVxdWVzdCcgfSBhcyBSZXF1ZXN0UGF0dGVybjtcbmNvbnN0IEFMTF9SRVFVRVNUX1JFUVVFU1RTICA9IHsgcmVxdWVzdFN0YWdlOiAnUmVzcG9uc2UnIH0gYXMgUmVxdWVzdFBhdHRlcm47XG5cbmNvbnN0IEFMTF9SRVFVRVNUU19EQVRBID0gW0FMTF9SRVFVRVNUX1JFUVVFU1RTLCBBTExfUkVRVUVTVF9SRVNQT05TRVNdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOYXRpdmVBdXRvbWF0aW9uUmVxdWVzdFBpcGVsaW5lIGV4dGVuZHMgTmF0aXZlQXV0b21hdGlvbkFwaUJhc2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlc3RSdW5CcmlkZ2U6IFRlc3RSdW5CcmlkZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udGV4dEluZm86IE5hdGl2ZUF1dG9tYXRpb25SZXF1ZXN0Q29udGV4dEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjogTmF0aXZlQXV0b21hdGlvblJlcXVlc3RIb29rRXZlbnRQcm92aWRlcjtcbiAgICBwdWJsaWMgcmVzdG9yaW5nU3RvcmFnZXM6IFN0b3JhZ2VzU25hcHNob3QgfCBudWxsO1xuICAgIHB1YmxpYyBjb250ZXh0U3RvcmFnZTogU2Vzc2lvblN0b3JhZ2VJbmZvIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvdXJjZUluamVjdG9yOiBSZXNvdXJjZUluamVjdG9yO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwZWNpYWxTZXJ2aWNlUm91dGVzOiBTcGVjaWFsU2VydmljZVJvdXRlcztcbiAgICBwcml2YXRlIF9zdG9wcGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2N1cnJlbnRGcmFtZVRyZWU6IEZyYW1lVHJlZSB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZmFpbGVkUmVxdWVzdElkczogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBfcGVuZGluZ0NlcnRpZmljYXRlRXJyb3I6IENlcnRpZmljYXRlRXJyb3JFdmVudCB8IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGJyb3dzZXJJZDogc3RyaW5nLCBjbGllbnQ6IFByb3RvY29sQXBpLCBvcHRpb25zOiBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoYnJvd3NlcklkLCBjbGllbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX3Rlc3RSdW5CcmlkZ2UgICAgICAgICAgID0gbmV3IFRlc3RSdW5CcmlkZ2UoYnJvd3NlcklkKTtcbiAgICAgICAgdGhpcy5fY29udGV4dEluZm8gICAgICAgICAgICAgPSBuZXcgTmF0aXZlQXV0b21hdGlvblJlcXVlc3RDb250ZXh0SW5mbyh0aGlzLl90ZXN0UnVuQnJpZGdlKTtcbiAgICAgICAgdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMgICAgPSB0aGlzLl9nZXRTcGVjaWFsU2VydmljZVJvdXRlcygpO1xuICAgICAgICB0aGlzLnJlcXVlc3RIb29rRXZlbnRQcm92aWRlciA9IG5ldyBOYXRpdmVBdXRvbWF0aW9uUmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlSW5qZWN0b3IgICAgICAgID0gbmV3IFJlc291cmNlSW5qZWN0b3IodGhpcy5fdGVzdFJ1bkJyaWRnZSk7XG4gICAgICAgIHRoaXMuX3N0b3BwZWQgICAgICAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRGcmFtZVRyZWUgICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZmFpbGVkUmVxdWVzdElkcyAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5yZXN0b3JpbmdTdG9yYWdlcyAgICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRleHRTdG9yYWdlICAgICAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdDZXJ0aWZpY2F0ZUVycm9yID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9zZXRPcHRpb25zRm9yUmVzb3VyY2VJbmplY3RvcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldE9wdGlvbnNGb3JSZXNvdXJjZUluamVjdG9yICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2NyZWF0ZVJlc291cmNlSW5qZWN0b3JPcHRpb25zKCk7XG5cbiAgICAgICAgdGhpcy5fcmVzb3VyY2VJbmplY3Rvci5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZVJlc291cmNlSW5qZWN0b3JPcHRpb25zICgpOiBSZXNvdXJjZUluamVjdG9yT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzcGVjaWFsU2VydmljZVJvdXRlczogdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMsXG4gICAgICAgICAgICBkZXZlbG9wbWVudE1vZGU6ICAgICAgdGhpcy5vcHRpb25zLmRldmVsb3BtZW50TW9kZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTcGVjaWFsU2VydmljZVJvdXRlcyAoKTogU3BlY2lhbFNlcnZpY2VSb3V0ZXMge1xuICAgICAgICBjb25zdCBicm93c2VyQ29ubmVjdGlvbiA9IHRoaXMuX3Rlc3RSdW5CcmlkZ2UuZ2V0QnJvd3NlckNvbm5lY3Rpb24oKTtcbiAgICAgICAgY29uc3QgcHJveHkgICAgICAgICAgICAgPSBicm93c2VyQ29ubmVjdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkucHJveHk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yUGFnZTE6ICAgICAgICAgIHByb3h5LnJlc29sdmVSZWxhdGl2ZVNlcnZpY2VVcmwoRVJST1JfUk9VVEUsIHByb3h5LnNlcnZlcjFJbmZvLmRvbWFpbiksXG4gICAgICAgICAgICBlcnJvclBhZ2UyOiAgICAgICAgICBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKEVSUk9SX1JPVVRFLCBwcm94eS5zZXJ2ZXIySW5mby5kb21haW4pLFxuICAgICAgICAgICAgaWRsZVBhZ2U6ICAgICAgICAgICAgYnJvd3NlckNvbm5lY3Rpb24uaWRsZVVybCxcbiAgICAgICAgICAgIG9wZW5GaWxlUHJvdG9jb2xVcmw6IGJyb3dzZXJDb25uZWN0aW9uLm9wZW5GaWxlUHJvdG9jb2xVcmwsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlTW9ja0Vycm9ySWZOZWNlc3NhcnkgKHBpcGVsaW5lQ29udGV4dDogTmF0aXZlQXV0b21hdGlvblBpcGVsaW5lQ29udGV4dCwgZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXBpcGVsaW5lQ29udGV4dC5tb2NrLmhhc0Vycm9yKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGF3YWl0IHBpcGVsaW5lQ29udGV4dC5oYW5kbGVNb2NrRXJyb3IodGhpcy5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIpO1xuXG4gICAgICAgIHJlcXVlc3RQaXBlbGluZU1vY2tMb2dnZXIoJyVzXFxuJXMnLCBldmVudC5uZXR3b3JrSWQsIHBpcGVsaW5lQ29udGV4dC5tb2NrLmVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9oYW5kbGVNb2NrUmVzcG9uc2UgKG1vY2tlZFJlc3BvbnNlOiBJbmNvbWluZ01lc3NhZ2VMaWtlLCBwaXBlbGluZUNvbnRleHQ6IE5hdGl2ZUF1dG9tYXRpb25QaXBlbGluZUNvbnRleHQsIGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIHNlc3Npb25JZDogU2Vzc2lvbklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLl9zdG9wcGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1vY2tlZFJlc3BvbnNlQm9keVN0ciA9IChtb2NrZWRSZXNwb25zZS5nZXRCb2R5KCkgYXMgQnVmZmVyKS50b1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGZ1bGZpbGxJbmZvID0ge1xuICAgICAgICAgICAgcmVxdWVzdElkOiAgICAgICBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6ICAgIG1vY2tlZFJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IGNvbnZlcnRUb0hlYWRlckVudHJpZXMobW9ja2VkUmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgICAgICBib2R5OiAgICAgICAgICAgIG1vY2tlZFJlc3BvbnNlQm9keVN0cixcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocGlwZWxpbmVDb250ZXh0LnJlcU9wdHMuaXNBamF4KVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzb3VyY2VJbmplY3Rvci5wcm9jZXNzTm9uUHJveGllZENvbnRlbnQoZnVsZmlsbEluZm8sIHRoaXMuX2NsaWVudCwgc2Vzc2lvbklkKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXNvdXJjZUluamVjdG9yLnByb2Nlc3NIVE1MUGFnZUNvbnRlbnQoZnVsZmlsbEluZm8sIHtcbiAgICAgICAgICAgICAgICBpc0lmcmFtZTogICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dFN0b3JhZ2U6IHRoaXMuY29udGV4dFN0b3JhZ2UsXG4gICAgICAgICAgICB9LCB0aGlzLl9jbGllbnQsIHNlc3Npb25JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0UGlwZWxpbmVNb2NrTG9nZ2VyKGBzZW50IG1vY2tlZCByZXNwb25zZSBmb3IgdGhlICR7ZXZlbnQucmVxdWVzdElkfWApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZUNvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBtb2RpZmllZDogYm9vbGVhbik6IENvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0IHtcbiAgICAgICAgY29uc3QgY29udGludWVSZXNwb25zZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGV2ZW50LnJlcXVlc3RJZCxcbiAgICAgICAgfSBhcyBDb250aW51ZVJlc3BvbnNlUmVxdWVzdDtcblxuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0LnJlc3BvbnNlSGVhZGVycyA9IGV2ZW50LnJlc3BvbnNlSGVhZGVycztcbiAgICAgICAgICAgIGNvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0LnJlc3BvbnNlQ29kZSAgICA9IGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSBhcyBudW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWVSZXNwb25zZVJlcXVlc3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvdWxkUmVkaXJlY3RUb0Vycm9yUGFnZSAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZXZlbnQucmVzb3VyY2VUeXBlID09PSAnRG9jdW1lbnQnXG4gICAgICAgICAgICAmJiAhdGhpcy5faXNJZnJhbWUoZXZlbnQuZnJhbWVJZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZ2V0VXNlclNjcmlwdHMgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQgfCBGcmFtZU5hdmlnYXRlZEV2ZW50KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCB7IHBpcGVsaW5lQ29udGV4dCwgZXZlbnRGYWN0b3J5IH0gPSB0aGlzLl9jb250ZXh0SW5mby5nZXRDb250ZXh0RGF0YShldmVudCk7XG5cbiAgICAgICAgYXdhaXQgcGlwZWxpbmVDb250ZXh0LnByZXBhcmVJbmplY3RhYmxlVXNlclNjcmlwdHMoZXZlbnRGYWN0b3J5LCB0aGlzLl90ZXN0UnVuQnJpZGdlLmdldFVzZXJTY3JpcHRzKCkpO1xuXG4gICAgICAgIHJldHVybiBwaXBlbGluZUNvbnRleHQuaW5qZWN0YWJsZVVzZXJTY3JpcHRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3BvbmRUb090aGVyUmVxdWVzdCAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGlzUmVkaXJlY3RTdGF0dXNDb2RlKGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlc3BvbnNlKHRoaXMuX2NsaWVudCwgeyByZXF1ZXN0SWQ6IGV2ZW50LnJlcXVlc3RJZCB9LCBzZXNzaW9uSWQpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvdXJjZUluZm8gPSBhd2FpdCB0aGlzLl9yZXNvdXJjZUluamVjdG9yLmdldERvY3VtZW50UmVzb3VyY2VJbmZvKGV2ZW50LCB0aGlzLl9jbGllbnQpO1xuXG4gICAgICAgIGlmIChyZXNvdXJjZUluZm8uZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaG91bGRSZWRpcmVjdFRvRXJyb3JQYWdlKGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Jlc291cmNlSW5qZWN0b3IucmVkaXJlY3RUb0Vycm9yUGFnZSh0aGlzLl9jbGllbnQsIHJlc291cmNlSW5mby5lcnJvciwgZXZlbnQucmVxdWVzdC51cmwpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dEluZm8uZGlzcG9zZShnZXRSZXF1ZXN0SWQoZXZlbnQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kaWZpZWQgPSBhd2FpdCB0aGlzLnJlcXVlc3RIb29rRXZlbnRQcm92aWRlci5vblJlc3BvbnNlKGV2ZW50LCByZXNvdXJjZUluZm8uYm9keSwgdGhpcy5fY29udGV4dEluZm8sIHRoaXMuX2NsaWVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX25lZWRJbmplY3RSZXNvdXJjZXMoZXZlbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxmaWxsSW5mbyA9IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6ICAgICAgIGV2ZW50LnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IGV2ZW50LnJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZUNvZGU6ICAgIGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgICAgYm9keTogICAgICAgICAgICAocmVzb3VyY2VJbmZvLmJvZHkgYXMgQnVmZmVyKS50b1N0cmluZygpLFxuICAgICAgICAgICAgfSBhcyBGdWxmaWxsUmVxdWVzdFJlcXVlc3Q7XG5cbiAgICAgICAgICAgIC8vIE5PVEU6IFN0cmFuZ2UgYmVoYXZpb3Igb2YgdGhlIENEUCBBUEk6XG4gICAgICAgICAgICAvLyBpZiB3ZSBwYXNzIHRoZSBlbXB0eSBcInJlc3BvbnNlU3RhdHVzVGV4dFwiIHZhbHVlLCB3ZSBnZXQgYW4gZXJyb3IgJ0ludmFsaWQgc3RhdHVzIGNvZGUgb3IgcGhyYXNlJy5cbiAgICAgICAgICAgIGlmIChldmVudC5yZXNwb25zZVN0YXR1c1RleHQgIT09ICcnKVxuICAgICAgICAgICAgICAgIGZ1bGZpbGxJbmZvLnJlc3BvbnNlUGhyYXNlID0gZXZlbnQucmVzcG9uc2VTdGF0dXNUZXh0O1xuXG4gICAgICAgICAgICBpZiAoaXNVbmF1dGhvcml6ZWQoZXZlbnQucmVzcG9uc2VTdGF0dXNDb2RlIGFzIG51bWJlcikpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJ5QXV0aG9yaXplV2l0aEh0dHBCYXNpY0F1dGhDcmVkZW50aWFscyhldmVudCwgZnVsZmlsbEluZm8pO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyU2NyaXB0cyA9IGF3YWl0IHRoaXMuX2dldFVzZXJTY3JpcHRzKGV2ZW50KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzb3VyY2VJbmplY3Rvci5wcm9jZXNzSFRNTFBhZ2VDb250ZW50KFxuICAgICAgICAgICAgICAgIGZ1bGZpbGxJbmZvLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaXNJZnJhbWU6ICAgICAgICAgIHRoaXMuX2lzSWZyYW1lKGV2ZW50LmZyYW1lSWQpLFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICAgICAgICAgICAgICAgZXZlbnQucmVxdWVzdC51cmwsXG4gICAgICAgICAgICAgICAgICAgIHJlc3RvcmluZ1N0b3JhZ2VzOiB0aGlzLnJlc3RvcmluZ1N0b3JhZ2VzLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3RvcmFnZTogICAgdGhpcy5jb250ZXh0U3RvcmFnZSxcbiAgICAgICAgICAgICAgICAgICAgdXNlclNjcmlwdHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGllbnQsIHNlc3Npb25JZCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRJbmZvLmRpc3Bvc2UoZ2V0UmVxdWVzdElkKGV2ZW50KSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzdG9yaW5nU3RvcmFnZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29udGludWVSZXNwb25zZVJlcXVlc3QgPSB0aGlzLl9jcmVhdGVDb250aW51ZVJlc3BvbnNlUmVxdWVzdChldmVudCwgbW9kaWZpZWQpO1xuXG4gICAgICAgICAgICBhd2FpdCBzYWZlQ29udGludWVSZXNwb25zZSh0aGlzLl9jbGllbnQsIGNvbnRpbnVlUmVzcG9uc2VSZXF1ZXN0LCBzZXNzaW9uSWQpO1xuXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SW5mby5kaXNwb3NlKGdldFJlcXVlc3RJZChldmVudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbmVlZEluamVjdFJlc291cmNlcyAoZXZlbnQ6IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZXZlbnQucmVzb3VyY2VUeXBlICE9PSAnRG9jdW1lbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gZXZlbnQucmVzcG9uc2VIZWFkZXJzXG4gICAgICAgICAgICA/LmZpbmQoaGVhZGVyID0+IGhlYWRlci5uYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKVxuICAgICAgICAgICAgPy52YWx1ZTtcblxuICAgICAgICBpZiAoY29udGVudFR5cGUpXG4gICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGVVdGlscy5pc1BhZ2UoY29udGVudFR5cGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3RyeUF1dGhvcml6ZVdpdGhIdHRwQmFzaWNBdXRoQ3JlZGVudGlhbHMgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGZ1bGZpbGxJbmZvOiBGdWxmaWxsUmVxdWVzdFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSB0aGlzLl90ZXN0UnVuLmdldEF1dGhDcmVkZW50aWFscygpO1xuXG4gICAgICAgIGlmICghY3JlZGVudGlhbHMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYXV0aFJlcXVlc3QgPSBhd2FpdCByZXNlbmRBdXRoUmVxdWVzdChldmVudC5yZXF1ZXN0LCBjcmVkZW50aWFscyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoUmVxdWVzdCAhPT0gJ3N0cmluZycgJiYgIWlzVW5hdXRob3JpemVkKGF1dGhSZXF1ZXN0LnN0YXR1cykpIHtcbiAgICAgICAgICAgIGZ1bGZpbGxJbmZvLnJlc3BvbnNlQ29kZSA9IGF1dGhSZXF1ZXN0LnN0YXR1cztcbiAgICAgICAgICAgIGZ1bGZpbGxJbmZvLmJvZHkgPSBhdXRoUmVxdWVzdC5ib2R5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBmdWxmaWxsSW5mby5yZXNwb25zZVBocmFzZSA9IGF1dGhSZXF1ZXN0LnN0YXR1c1RleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVFcnJvciAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCk6IEVycm9yIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDZXJ0aWZpY2F0ZUVycm9yKVxuICAgICAgICAgICAgcmV0dXJuIHNzbENlcnRpZmljYXRlRXJyb3IodGhpcy5fcGVuZGluZ0NlcnRpZmljYXRlRXJyb3IuZXJyb3JUeXBlKTtcblxuICAgICAgICBpZiAoZXZlbnQucmVzcG9uc2VFcnJvclJlYXNvbiA9PT0gJ05hbWVOb3RSZXNvbHZlZCcpXG4gICAgICAgICAgICByZXR1cm4gZmFpbGVkVG9GaW5kRE5TRXJyb3IoZXZlbnQucmVxdWVzdC51cmwpO1xuXG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoZXZlbnQucmVzcG9uc2VFcnJvclJlYXNvbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdHJ5UmVzcG9uZFRvT3RoZXJSZXF1ZXN0IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBzZXNzaW9uSWQ6IFNlc3Npb25JZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnJlc3BvbnNlRXJyb3JSZWFzb24gJiYgdGhpcy5fc2hvdWxkUmVkaXJlY3RUb0Vycm9yUGFnZShldmVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuX2NyZWF0ZUVycm9yKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Jlc291cmNlSW5qZWN0b3IucmVkaXJlY3RUb0Vycm9yUGFnZSh0aGlzLl9jbGllbnQsIGVycm9yLCBldmVudC5yZXF1ZXN0LnVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzcG9uZFRvT3RoZXJSZXF1ZXN0KGV2ZW50LCBzZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5uZXR3b3JrSWQgJiYgdGhpcy5fZmFpbGVkUmVxdWVzdElkcy5pbmNsdWRlcyhldmVudC5uZXR3b3JrSWQpKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlKHRoaXMuX2ZhaWxlZFJlcXVlc3RJZHMsIGV2ZW50Lm5ldHdvcmtJZCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2hhbmRsZU90aGVyUmVxdWVzdHMgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIHNlc3Npb25JZDogU2Vzc2lvbklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJlcXVlc3RQaXBlbGluZU90aGVyUmVxdWVzdExvZ2dlcignJXInLCBldmVudCk7XG5cbiAgICAgICAgaWYgKCFldmVudC5yZXNwb25zZUVycm9yUmVhc29uICYmIChpc1JlcXVlc3QoZXZlbnQpIHx8IGlzUmVkaXJlY3RTdGF0dXNDb2RlKGV2ZW50LnJlc3BvbnNlU3RhdHVzQ29kZSkpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SW5mby5pbml0KGV2ZW50KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0SG9va0V2ZW50UHJvdmlkZXIub25SZXF1ZXN0KGV2ZW50LCB0aGlzLl9jb250ZXh0SW5mbyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBpcGVsaW5lQ29udGV4dCA9IHRoaXMuX2NvbnRleHRJbmZvLmdldFBpcGVsaW5lQ29udGV4dChnZXRSZXF1ZXN0SWQoZXZlbnQpKTtcblxuICAgICAgICAgICAgaWYgKCFwaXBlbGluZUNvbnRleHQgfHwgIXBpcGVsaW5lQ29udGV4dC5tb2NrKVxuICAgICAgICAgICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlcXVlc3QodGhpcy5fY2xpZW50LCBldmVudCwgc2Vzc2lvbklkLCB0aGlzLl9jcmVhdGVDb250aW51ZUV2ZW50QXJncyhldmVudCwgcGlwZWxpbmVDb250ZXh0LnJlcU9wdHMpKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RQaXBlbGluZU1vY2tMb2dnZXIoJ2JlZ2luIG1vY2tpbmcgcmVxdWVzdCAlcicsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1vY2tlZFJlc3BvbnNlID0gYXdhaXQgcGlwZWxpbmVDb250ZXh0LmdldE1vY2tSZXNwb25zZSgpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlTW9ja0Vycm9ySWZOZWNlc3NhcnkocGlwZWxpbmVDb250ZXh0LCBldmVudCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2NrZWRSZXNwb25zZUV2ZW50ID0gY3JlYXRlUmVxdWVzdFBhdXNlZEV2ZW50Rm9yUmVzcG9uc2UobW9ja2VkUmVzcG9uc2UsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdEhvb2tFdmVudFByb3ZpZGVyLm9uUmVzcG9uc2UobW9ja2VkUmVzcG9uc2VFdmVudCwgbW9ja2VkUmVzcG9uc2UuZ2V0Qm9keSgpLCB0aGlzLl9jb250ZXh0SW5mbywgdGhpcy5fY2xpZW50KTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZU1vY2tSZXNwb25zZShtb2NrZWRSZXNwb25zZSwgcGlwZWxpbmVDb250ZXh0LCBldmVudCwgc2Vzc2lvbklkKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHRJbmZvLmRpc3Bvc2UoZ2V0UmVxdWVzdElkKGV2ZW50KSk7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0UGlwZWxpbmVNb2NrTG9nZ2VyKCdlbmQgbW9ja2luZyByZXF1ZXN0ICVyJywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3RyeVJlc3BvbmRUb090aGVyUmVxdWVzdChldmVudCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRVcGxvYWRQb3N0RGF0YSAoZXZlbnQ6IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghZXZlbnQucmVxdWVzdC5wb3N0RGF0YSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgY29uc3QgY29udGVudFR5cGVIZWFkZXIgPSBldmVudC5yZXF1ZXN0LmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcG9zdERhdGEgICAgICAgICAgPSBCdWZmZXIuZnJvbShldmVudC5yZXF1ZXN0LnBvc3REYXRhLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgYm9keVdpdGhVcGxvYWRzICAgPSBpbmplY3RVcGxvYWQoY29udGVudFR5cGVIZWFkZXIsIHBvc3REYXRhKTtcblxuICAgICAgICByZXR1cm4gYm9keVdpdGhVcGxvYWRzID8gYm9keVdpdGhVcGxvYWRzLnRvU3RyaW5nKCdiYXNlNjQnKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b3BGcmFtZU5hdmlnYXRpb24gKGV2ZW50OiBGcmFtZU5hdmlnYXRlZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBldmVudC50eXBlID09PSAnTmF2aWdhdGlvbidcbiAgICAgICAgICAgICYmICFldmVudC5mcmFtZS5wYXJlbnRJZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF91cGRhdGVDdXJyZW50RnJhbWVUcmVlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gTk9URTogRHVlIHRvIENEUCByZXN0cmljdGlvbnMgKGl0IGhhbmdzKSwgd2UgY2FuJ3QgZ2V0IHRoZSBmcmFtZSB0cmVlXG4gICAgICAgIC8vIHJpZ2h0IGJlZm9yZSBpbmplY3Rpbmcgc2VydmljZSBzY3JpcHRzLlxuICAgICAgICAvLyBTbywgd2UgYXJlIGZvcmNlZCB0cmFja2luZyBmcmFtZXMgdHJlZS5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fY2xpZW50LlBhZ2UuZ2V0RnJhbWVUcmVlKCk7XG5cbiAgICAgICAgdGhpcy5fY3VycmVudEZyYW1lVHJlZSA9IHJlc3VsdC5mcmFtZVRyZWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNJZnJhbWUgKGZyYW1lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRGcmFtZVRyZWUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRGcmFtZVRyZWUuZnJhbWUuaWQgIT09IGZyYW1lSWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGZvcmNlZCB0byBoYW5kbGUgYWxsIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXQgb25jZVxuICAgICAgICAvLyBiZWNhdXNlIENEUCBBUEkgZG9lcyBub3QgYWxsb3cgc3BlY2lmeWluZyByZXF1ZXN0IGZpbHRlcmluZyBiZWhhdmlvciBmb3IgZGlmZmVyZW50IGhhbmRsZXJzLlxuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuRmV0Y2guZW5hYmxlKHtcbiAgICAgICAgICAgIHBhdHRlcm5zOiBBTExfUkVRVUVTVFNfREFUQSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LlRhcmdldC5zZXRBdXRvQXR0YWNoKHtcbiAgICAgICAgICAgIGF1dG9BdHRhY2g6ICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbjogICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTk9URTogV2UgbmVlZCB0byBlbmFibGUgdGhlIEZldGNoIGRvbWFpbiBmb3IgaWZyYW1lIHRhcmdldHNcbiAgICAgICAgLy8gdG8gaW50ZXJjZXB0IHNvbWUgcmVxdWVzdHMuIFdlIG5lZWQgdG8gdXNlIHRoZSBgc2Vzc2lvbklkYCBvcHRpb25cbiAgICAgICAgLy8gaW4gY29udGludWVSZXF1ZXN0L2NvbnRpbnVlUmVzcG9uc2UvZnVsZmlsbFJlcXVlc3QgbWV0aG9kc1xuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuVGFyZ2V0Lm9uKCdhdHRhY2hlZFRvVGFyZ2V0JywgYXN5bmMgZXZlbnQgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2xpZW50LlJ1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXIoZXZlbnQuc2Vzc2lvbklkKTtcblxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldEluZm8udHlwZSAhPT0gJ3dvcmtlcicpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5GZXRjaC5lbmFibGUoeyBwYXR0ZXJuczogQUxMX1JFUVVFU1RTX0RBVEEgfSwgZXZlbnQuc2Vzc2lvbklkKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuX2NsaWVudC5GZXRjaC5vbigncmVxdWVzdFBhdXNlZCcsIGFzeW5jIChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBzZXNzaW9uSWQ6IFNlc3Npb25JZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3BwZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBzcGVjaWFsUmVxdWVzdEhhbmRsZXIgPSBnZXRTcGVjaWFsUmVxdWVzdEhhbmRsZXIoZXZlbnQsIHRoaXMub3B0aW9ucywgdGhpcy5fc3BlY2lhbFNlcnZpY2VSb3V0ZXMpO1xuXG4gICAgICAgICAgICBpZiAoc3BlY2lhbFJlcXVlc3RIYW5kbGVyKVxuICAgICAgICAgICAgICAgIGF3YWl0IHNwZWNpYWxSZXF1ZXN0SGFuZGxlcihldmVudCwgdGhpcy5fY2xpZW50LCB0aGlzLm9wdGlvbnMsIHNlc3Npb25JZCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5faGFuZGxlT3RoZXJSZXF1ZXN0cyhldmVudCwgc2Vzc2lvbklkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fY2xpZW50LlBhZ2Uub24oJ2ZyYW1lTmF2aWdhdGVkJywgYXN5bmMgKGV2ZW50OiBGcmFtZU5hdmlnYXRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0UGlwZWxpbmVMb2dnZXIoJyVmJywgZXZlbnQpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RvcEZyYW1lTmF2aWdhdGlvbihldmVudClcbiAgICAgICAgICAgICAgICB8fCBldmVudC5mcmFtZS51cmwgIT09IFNQRUNJQUxfQkxBTktfUEFHRSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRJbmZvLmluaXQoZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyU2NyaXB0cyA9IGF3YWl0IHRoaXMuX2dldFVzZXJTY3JpcHRzKGV2ZW50KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzb3VyY2VJbmplY3Rvci5wcm9jZXNzQWJvdXRCbGFua1BhZ2UoZXZlbnQsIHVzZXJTY3JpcHRzLCB0aGlzLmNvbnRleHRTdG9yYWdlLCB0aGlzLl9jbGllbnQpO1xuXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SW5mby5kaXNwb3NlKGdldFJlcXVlc3RJZChldmVudCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jbGllbnQuUGFnZS5vbignZnJhbWVTdGFydGVkTG9hZGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZUN1cnJlbnRGcmFtZVRyZWUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fY2xpZW50Lk5ldHdvcmsub24oJ2xvYWRpbmdGYWlsZWQnLCBhc3luYyAoZXZlbnQ6IExvYWRpbmdGYWlsZWRFdmVudCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdFBpcGVsaW5lTG9nZ2VyKCclbCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgdGhpcy5fZmFpbGVkUmVxdWVzdElkcy5wdXNoKGV2ZW50LnJlcXVlc3RJZCk7XG5cbiAgICAgICAgICAgIGlmIChldmVudC5yZXF1ZXN0SWQpXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dEluZm8uZGlzcG9zZShldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9jbGllbnQuUGFnZS5zZXRCeXBhc3NDU1AoeyBlbmFibGVkOiB0cnVlIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5TZWN1cml0eS5lbmFibGUoKTtcblxuICAgICAgICB0aGlzLl9jbGllbnQuU2VjdXJpdHkub24oJ2NlcnRpZmljYXRlRXJyb3InLCBhc3luYyAoZXZlbnQ6IENlcnRpZmljYXRlRXJyb3JFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0NlcnRpZmljYXRlRXJyb3IgPSBldmVudDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0b3AgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5GZXRjaC5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlQ29udGludWVFdmVudEFyZ3MgKGV2ZW50OiBQcm90b2NvbC5GZXRjaC5SZXF1ZXN0UGF1c2VkRXZlbnQsIHJlcU9wdHM6IGFueSk6IENvbnRpbnVlUmVxdWVzdEFyZ3Mge1xuICAgICAgICBjb25zdCBtb2RpZmllZFVybCAgPSBuZXcgVVJMKGV2ZW50LnJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3QgaG9zdCAgICAgICAgID0gbW9kaWZpZWRVcmwuaG9zdDtcblxuICAgICAgICBsZXQgaG9zdE1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGxldCBwb3J0TW9kaWZpZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobW9kaWZpZWRVcmwuaG9zdG5hbWUgIT09IHJlcU9wdHMuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkVXJsLmhvc3RuYW1lID0gcmVxT3B0cy5ob3N0bmFtZTtcbiAgICAgICAgICAgIGhvc3RNb2RpZmllZCAgICAgICAgID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RpZmllZFVybC5wb3J0ICE9PSByZXFPcHRzLnBvcnQpIHtcbiAgICAgICAgICAgIG1vZGlmaWVkVXJsLnBvcnQgPSByZXFPcHRzLnBvcnQ7XG4gICAgICAgICAgICBwb3J0TW9kaWZpZWQgICAgID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3N0ICE9PSByZXFPcHRzLmhvc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUgfSA9IG5ldyBVUkwocmVxT3B0cy5wcm90b2NvbCArICcvLycgKyByZXFPcHRzLmhvc3QpO1xuXG4gICAgICAgICAgICBpZiAoIWhvc3RNb2RpZmllZClcbiAgICAgICAgICAgICAgICBtb2RpZmllZFVybC5ob3N0bmFtZSA9IGhvc3RuYW1lO1xuXG4gICAgICAgICAgICBpZiAoIXBvcnRNb2RpZmllZClcbiAgICAgICAgICAgICAgICBtb2RpZmllZFVybC5wb3J0ID0gcG9ydDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc3REYXRhID0gdGhpcy5fZ2V0VXBsb2FkUG9zdERhdGEoZXZlbnQpO1xuICAgICAgICBjb25zdCB1cmwgICAgICA9IG1vZGlmaWVkVXJsLnRvU3RyaW5nKCkgIT09IGV2ZW50LnJlcXVlc3QudXJsID8gbW9kaWZpZWRVcmwudG9TdHJpbmcoKSA6IHZvaWQgMDtcbiAgICAgICAgY29uc3QgbWV0aG9kICAgPSByZXFPcHRzLm1ldGhvZDtcblxuICAgICAgICByZXR1cm4geyBwb3N0RGF0YSwgdXJsLCBtZXRob2QgfTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resendAuthRequest = void 0;
|
|
7
|
+
const send_1 = require("../../test-run/request/send");
|
|
8
|
+
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
const url_to_options_1 = __importDefault(require("url-to-options"));
|
|
11
|
+
async function resendAuthRequest(request, credentials) {
|
|
12
|
+
const url = new URL(request.url);
|
|
13
|
+
const urlRequestOptions = (0, url_to_options_1.default)(url);
|
|
14
|
+
const requestOptions = new testcafe_hammerhead_1.RequestOptions(Object.assign(urlRequestOptions, {
|
|
15
|
+
body: request.postData || '',
|
|
16
|
+
auth: `${credentials.username}:${credentials.password}`,
|
|
17
|
+
headers: request.headers,
|
|
18
|
+
method: request.method,
|
|
19
|
+
}));
|
|
20
|
+
return (0, send_1.send)(requestOptions);
|
|
21
|
+
}
|
|
22
|
+
exports.resendAuthRequest = resendAuthRequest;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZW5kQXV0aFJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmF0aXZlLWF1dG9tYXRpb24vcmVxdWVzdC1waXBlbGluZS9yZXNlbmRBdXRoUmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxzREFBbUQ7QUFFbkQsNkRBQXFEO0FBQ3JELGFBQWE7QUFDYixvRUFBOEM7QUFFdkMsS0FBSyxVQUFVLGlCQUFpQixDQUFFLE9BQXdCLEVBQUUsV0FBNEI7SUFDM0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSx3QkFBZ0IsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUVoRCxNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtRQUN2RSxJQUFJLEVBQUssT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO1FBQy9CLElBQUksRUFBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRTtRQUMxRCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsTUFBTSxFQUFHLE9BQU8sQ0FBQyxNQUFNO0tBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUosT0FBTyxJQUFBLFdBQUksRUFBQyxjQUFjLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBYkQsOENBYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IE5ldHdvcmsgPSBQcm90b2NvbC5OZXR3b3JrO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWxzIH0gZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHNlbmQgfSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9yZXF1ZXN0L3NlbmQnO1xuaW1wb3J0IHsgUmVzcG9uc2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vdGVzdC1ydW4vcmVxdWVzdC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgdXJsVG9IdHRwT3B0aW9ucyBmcm9tICd1cmwtdG8tb3B0aW9ucyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNlbmRBdXRoUmVxdWVzdCAocmVxdWVzdDogTmV0d29yay5SZXF1ZXN0LCBjcmVkZW50aWFsczogQXV0aENyZWRlbnRpYWxzKTogUHJvbWlzZTxSZXNwb25zZU9wdGlvbnMgfCBzdHJpbmc+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcblxuICAgIGNvbnN0IHVybFJlcXVlc3RPcHRpb25zID0gdXJsVG9IdHRwT3B0aW9ucyh1cmwpO1xuXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSBuZXcgUmVxdWVzdE9wdGlvbnMoT2JqZWN0LmFzc2lnbih1cmxSZXF1ZXN0T3B0aW9ucywge1xuICAgICAgICBib2R5OiAgICByZXF1ZXN0LnBvc3REYXRhIHx8ICcnLFxuICAgICAgICBhdXRoOiAgICBgJHtjcmVkZW50aWFscy51c2VybmFtZX06JHtjcmVkZW50aWFscy5wYXNzd29yZH1gLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIG1ldGhvZDogIHJlcXVlc3QubWV0aG9kLFxuICAgIH0pKTtcblxuICAgIHJldHVybiBzZW5kKHJlcXVlc3RPcHRpb25zKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeFailRequest = exports.safeContinueRequest = exports.safeFulfillRequest = exports.safeContinueResponse = void 0;
|
|
4
|
+
const debug_loggers_1 = require("../../utils/debug-loggers");
|
|
5
|
+
const cdp_1 = require("../utils/cdp");
|
|
6
|
+
const INVALID_INTERCEPTED_RESPONSE_ERROR_MSG = 'Invalid InterceptionId.';
|
|
7
|
+
// In some cases (a request was aborted, any page that initiated the request doesn't exist, etc.)
|
|
8
|
+
// Chrome Debug Protocol doesn't allow to continue request pipeline
|
|
9
|
+
// and raises the "Invalid InterceptionId" error.
|
|
10
|
+
// We use the simplest way to fix it - omit such an error.
|
|
11
|
+
async function connectionResetGuard(handleRequestFn, handleErrorFn) {
|
|
12
|
+
try {
|
|
13
|
+
await handleRequestFn();
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
if (err.message === INVALID_INTERCEPTED_RESPONSE_ERROR_MSG)
|
|
17
|
+
return;
|
|
18
|
+
handleErrorFn(err);
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function safeContinueResponse(client, data, sessionId) {
|
|
23
|
+
const isPausedEvent = (0, cdp_1.isRequestPausedEvent)(data);
|
|
24
|
+
await connectionResetGuard(async () => {
|
|
25
|
+
const param = isPausedEvent
|
|
26
|
+
? { requestId: data.requestId }
|
|
27
|
+
: data;
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
await client.Fetch.continueResponse(param, sessionId);
|
|
30
|
+
}, err => {
|
|
31
|
+
const formatter = isPausedEvent ? '%r' : '%s';
|
|
32
|
+
(0, debug_loggers_1.requestPipelineLogger)(`Fetch.continueResponse. Unhandled error %s during processing ${formatter}`, err, data);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
exports.safeContinueResponse = safeContinueResponse;
|
|
36
|
+
async function safeFulfillRequest(client, fulfillInfo, sessionId) {
|
|
37
|
+
await connectionResetGuard(async () => {
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
await client.Fetch.fulfillRequest(fulfillInfo, sessionId);
|
|
40
|
+
}, err => {
|
|
41
|
+
(0, debug_loggers_1.requestPipelineLogger)(`Fetch.fulfillRequest. Unhandled error %s during processing %s`, err, fulfillInfo.requestId);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
exports.safeFulfillRequest = safeFulfillRequest;
|
|
45
|
+
async function safeContinueRequest(client, event, sessionId, continueRequestArgs) {
|
|
46
|
+
const { postData, method, url } = continueRequestArgs || {};
|
|
47
|
+
await connectionResetGuard(async () => {
|
|
48
|
+
// @ts-ignore
|
|
49
|
+
await client.Fetch.continueRequest({ requestId: event.requestId, postData, method, url }, sessionId);
|
|
50
|
+
}, err => {
|
|
51
|
+
(0, debug_loggers_1.requestPipelineLogger)(`Fetch.continueRequest. Unhandled error %s during processing %r`, err, event);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
exports.safeContinueRequest = safeContinueRequest;
|
|
55
|
+
async function safeFailRequest(client, event, errorReason = 'Aborted') {
|
|
56
|
+
await connectionResetGuard(async () => {
|
|
57
|
+
await client.Fetch.failRequest({
|
|
58
|
+
requestId: event.requestId,
|
|
59
|
+
errorReason,
|
|
60
|
+
});
|
|
61
|
+
}, err => {
|
|
62
|
+
(0, debug_loggers_1.requestPipelineLogger)(`Fetch.failRequest. Unhandled error %s during processing %s`, err, event.requestId);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
exports.safeFailRequest = safeFailRequest;
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmF0aXZlLWF1dG9tYXRpb24vcmVxdWVzdC1waXBlbGluZS9zYWZlLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBa0U7QUFNbEUsc0NBQW9EO0FBR3BELE1BQU0sc0NBQXNDLEdBQUcseUJBQXlCLENBQUM7QUFFekUsaUdBQWlHO0FBQ2pHLG1FQUFtRTtBQUNuRSxpREFBaUQ7QUFDakQsMERBQTBEO0FBRTFELEtBQUssVUFBVSxvQkFBb0IsQ0FBRSxlQUFvQyxFQUFFLGFBQWlDO0lBQ3hHLElBQUk7UUFDQSxNQUFNLGVBQWUsRUFBRSxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxHQUFRLEVBQUU7UUFDYixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssc0NBQXNDO1lBQ3RELE9BQU87UUFFWCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkIsTUFBTSxHQUFHLENBQUM7S0FDYjtBQUNMLENBQUM7QUFFTSxLQUFLLFVBQVUsb0JBQW9CLENBQUUsTUFBbUIsRUFBRSxJQUFrRCxFQUFFLFNBQW9CO0lBQ3JJLE1BQU0sYUFBYSxHQUFHLElBQUEsMEJBQW9CLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFFakQsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxNQUFNLEtBQUssR0FBRyxhQUFhO1lBQ3ZCLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFWCxhQUFhO1FBQ2IsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDTCxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRTlDLElBQUEscUNBQXFCLEVBQUMsZ0VBQWdFLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFmRCxvREFlQztBQUVNLEtBQUssVUFBVSxrQkFBa0IsQ0FBRSxNQUFtQixFQUFFLFdBQWtDLEVBQUUsU0FBb0I7SUFDbkgsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxhQUFhO1FBQ2IsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ0wsSUFBQSxxQ0FBcUIsRUFBQywrREFBK0QsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVBELGdEQU9DO0FBRU0sS0FBSyxVQUFVLG1CQUFtQixDQUFFLE1BQW1CLEVBQUUsS0FBeUIsRUFBRSxTQUFvQixFQUFFLG1CQUF5QztJQUN0SixNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsSUFBSSxFQUFFLENBQUM7SUFFNUQsTUFBTSxvQkFBb0IsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQyxhQUFhO1FBQ2IsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDekcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ0wsSUFBQSxxQ0FBcUIsRUFBQyxnRUFBZ0UsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEcsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBVEQsa0RBU0M7QUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFFLE1BQW1CLEVBQUUsS0FBeUIsRUFBRSxjQUEyQixTQUFTO0lBQ3ZILE1BQU0sb0JBQW9CLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDbEMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUMzQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsV0FBVztTQUNkLENBQUMsQ0FBQztJQUNQLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNMLElBQUEscUNBQXFCLEVBQUMsNERBQTRELEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFURCwwQ0FTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByb3RvY29sQXBpIH0gZnJvbSAnY2hyb21lLXJlbW90ZS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVxdWVzdFBpcGVsaW5lTG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGVidWctbG9nZ2Vycyc7XG5pbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IFJlcXVlc3RQYXVzZWRFdmVudCA9IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudDtcbmltcG9ydCBGdWxmaWxsUmVxdWVzdFJlcXVlc3QgPSBQcm90b2NvbC5GZXRjaC5GdWxmaWxsUmVxdWVzdFJlcXVlc3Q7XG5pbXBvcnQgQ29udGludWVSZXNwb25zZVJlcXVlc3QgPSBQcm90b2NvbC5GZXRjaC5Db250aW51ZVJlc3BvbnNlUmVxdWVzdDtcbmltcG9ydCBFcnJvclJlYXNvbiA9IFByb3RvY29sLk5ldHdvcmsuRXJyb3JSZWFzb247XG5pbXBvcnQgeyBpc1JlcXVlc3RQYXVzZWRFdmVudCB9IGZyb20gJy4uL3V0aWxzL2NkcCc7XG5pbXBvcnQgeyBDb250aW51ZVJlcXVlc3RBcmdzLCBTZXNzaW9uSWQgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IElOVkFMSURfSU5URVJDRVBURURfUkVTUE9OU0VfRVJST1JfTVNHID0gJ0ludmFsaWQgSW50ZXJjZXB0aW9uSWQuJztcblxuLy8gSW4gc29tZSBjYXNlcyAoYSByZXF1ZXN0IHdhcyBhYm9ydGVkLCBhbnkgcGFnZSB0aGF0IGluaXRpYXRlZCB0aGUgcmVxdWVzdCBkb2Vzbid0IGV4aXN0LCBldGMuKVxuLy8gQ2hyb21lIERlYnVnIFByb3RvY29sIGRvZXNuJ3QgYWxsb3cgdG8gY29udGludWUgcmVxdWVzdCBwaXBlbGluZVxuLy8gYW5kIHJhaXNlcyB0aGUgXCJJbnZhbGlkIEludGVyY2VwdGlvbklkXCIgZXJyb3IuXG4vLyBXZSB1c2UgdGhlIHNpbXBsZXN0IHdheSB0byBmaXggaXQgLSBvbWl0IHN1Y2ggYW4gZXJyb3IuXG5cbmFzeW5jIGZ1bmN0aW9uIGNvbm5lY3Rpb25SZXNldEd1YXJkIChoYW5kbGVSZXF1ZXN0Rm46ICgpID0+IFByb21pc2U8dm9pZD4sIGhhbmRsZUVycm9yRm46IChlcnI6IGFueSkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZVJlcXVlc3RGbigpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5tZXNzYWdlID09PSBJTlZBTElEX0lOVEVSQ0VQVEVEX1JFU1BPTlNFX0VSUk9SX01TRylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBoYW5kbGVFcnJvckZuKGVycik7XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVDb250aW51ZVJlc3BvbnNlIChjbGllbnQ6IFByb3RvY29sQXBpLCBkYXRhOiBSZXF1ZXN0UGF1c2VkRXZlbnQgfCBDb250aW51ZVJlc3BvbnNlUmVxdWVzdCwgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpc1BhdXNlZEV2ZW50ID0gaXNSZXF1ZXN0UGF1c2VkRXZlbnQoZGF0YSk7XG5cbiAgICBhd2FpdCBjb25uZWN0aW9uUmVzZXRHdWFyZChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmFtID0gaXNQYXVzZWRFdmVudFxuICAgICAgICAgICAgPyB7IHJlcXVlc3RJZDogZGF0YS5yZXF1ZXN0SWQgfVxuICAgICAgICAgICAgOiBkYXRhO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYXdhaXQgY2xpZW50LkZldGNoLmNvbnRpbnVlUmVzcG9uc2UocGFyYW0sIHNlc3Npb25JZCk7XG4gICAgfSwgZXJyID0+IHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gaXNQYXVzZWRFdmVudCA/ICclcicgOiAnJXMnO1xuXG4gICAgICAgIHJlcXVlc3RQaXBlbGluZUxvZ2dlcihgRmV0Y2guY29udGludWVSZXNwb25zZS4gVW5oYW5kbGVkIGVycm9yICVzIGR1cmluZyBwcm9jZXNzaW5nICR7Zm9ybWF0dGVyfWAsIGVyciwgZGF0YSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlRnVsZmlsbFJlcXVlc3QgKGNsaWVudDogUHJvdG9jb2xBcGksIGZ1bGZpbGxJbmZvOiBGdWxmaWxsUmVxdWVzdFJlcXVlc3QsIHNlc3Npb25JZDogU2Vzc2lvbklkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY29ubmVjdGlvblJlc2V0R3VhcmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGF3YWl0IGNsaWVudC5GZXRjaC5mdWxmaWxsUmVxdWVzdChmdWxmaWxsSW5mbywgc2Vzc2lvbklkKTtcbiAgICB9LCBlcnIgPT4ge1xuICAgICAgICByZXF1ZXN0UGlwZWxpbmVMb2dnZXIoYEZldGNoLmZ1bGZpbGxSZXF1ZXN0LiBVbmhhbmRsZWQgZXJyb3IgJXMgZHVyaW5nIHByb2Nlc3NpbmcgJXNgLCBlcnIsIGZ1bGZpbGxJbmZvLnJlcXVlc3RJZCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYWZlQ29udGludWVSZXF1ZXN0IChjbGllbnQ6IFByb3RvY29sQXBpLCBldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBzZXNzaW9uSWQ6IFNlc3Npb25JZCwgY29udGludWVSZXF1ZXN0QXJncz86IENvbnRpbnVlUmVxdWVzdEFyZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHBvc3REYXRhLCBtZXRob2QsIHVybCB9ID0gY29udGludWVSZXF1ZXN0QXJncyB8fCB7fTtcblxuICAgIGF3YWl0IGNvbm5lY3Rpb25SZXNldEd1YXJkKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBhd2FpdCBjbGllbnQuRmV0Y2guY29udGludWVSZXF1ZXN0KHsgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsIHBvc3REYXRhLCBtZXRob2QsIHVybCB9LCBzZXNzaW9uSWQpO1xuICAgIH0sIGVyciA9PiB7XG4gICAgICAgIHJlcXVlc3RQaXBlbGluZUxvZ2dlcihgRmV0Y2guY29udGludWVSZXF1ZXN0LiBVbmhhbmRsZWQgZXJyb3IgJXMgZHVyaW5nIHByb2Nlc3NpbmcgJXJgLCBlcnIsIGV2ZW50KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhZmVGYWlsUmVxdWVzdCAoY2xpZW50OiBQcm90b2NvbEFwaSwgZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgZXJyb3JSZWFzb246IEVycm9yUmVhc29uID0gJ0Fib3J0ZWQnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY29ubmVjdGlvblJlc2V0R3VhcmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjbGllbnQuRmV0Y2guZmFpbFJlcXVlc3Qoe1xuICAgICAgICAgICAgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICBlcnJvclJlYXNvbixcbiAgICAgICAgfSk7XG4gICAgfSwgZXJyID0+IHtcbiAgICAgICAgcmVxdWVzdFBpcGVsaW5lTG9nZ2VyKGBGZXRjaC5mYWlsUmVxdWVzdC4gVW5oYW5kbGVkIGVycm9yICVzIGR1cmluZyBwcm9jZXNzaW5nICVzYCwgZXJyLCBldmVudC5yZXF1ZXN0SWQpO1xuICAgIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const injectables_1 = require("../../assets/injectables");
|
|
7
|
+
const debug_loggers_1 = require("../../utils/debug-loggers");
|
|
8
|
+
const cdp_1 = require("../utils/cdp");
|
|
9
|
+
const constants_1 = require("./constants");
|
|
10
|
+
const http_status_codes_1 = require("http-status-codes");
|
|
11
|
+
const load_assets_1 = __importDefault(require("../../load-assets"));
|
|
12
|
+
const string_1 = require("../utils/string");
|
|
13
|
+
const safe_api_1 = require("./safe-api");
|
|
14
|
+
async function handleRequestPauseEvent(event, client, sessionId) {
|
|
15
|
+
if ((0, cdp_1.isRequest)(event))
|
|
16
|
+
await (0, safe_api_1.safeContinueRequest)(client, event, sessionId);
|
|
17
|
+
else
|
|
18
|
+
await (0, safe_api_1.safeContinueResponse)(client, event, sessionId);
|
|
19
|
+
}
|
|
20
|
+
const internalRequest = {
|
|
21
|
+
condition: (event) => !event.networkId && event.resourceType !== 'Document' && !event.request.url,
|
|
22
|
+
handler: async (event, client, options, sessionId) => {
|
|
23
|
+
(0, debug_loggers_1.requestPipelineInternalRequestLogger)('%r', event);
|
|
24
|
+
await handleRequestPauseEvent(event, client, sessionId);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
const serviceRequest = {
|
|
28
|
+
condition: (event, options, serviceRoutes) => {
|
|
29
|
+
const url = event.request.url;
|
|
30
|
+
// NOTE: the service 'Error page' should be proxied.
|
|
31
|
+
if (url === serviceRoutes.errorPage1
|
|
32
|
+
|| url === serviceRoutes.errorPage2)
|
|
33
|
+
return false;
|
|
34
|
+
return options.serviceDomains.some(domain => url.startsWith(domain));
|
|
35
|
+
},
|
|
36
|
+
handler: async (event, client, options, sessionId) => {
|
|
37
|
+
(0, debug_loggers_1.requestPipelineServiceRequestLogger)('%r', event);
|
|
38
|
+
await handleRequestPauseEvent(event, client, sessionId);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
const defaultFaviconRequest = {
|
|
42
|
+
condition: (event) => {
|
|
43
|
+
const parsedUrl = new URL(event.request.url);
|
|
44
|
+
return parsedUrl.pathname === injectables_1.DEFAULT_FAVICON_PATH;
|
|
45
|
+
},
|
|
46
|
+
handler: async (event, client, options, sessionId) => {
|
|
47
|
+
(0, debug_loggers_1.requestPipelineLogger)('%r', event);
|
|
48
|
+
if ((0, cdp_1.isRequest)(event))
|
|
49
|
+
await (0, safe_api_1.safeContinueRequest)(client, event, sessionId);
|
|
50
|
+
else {
|
|
51
|
+
if (event.responseStatusCode === http_status_codes_1.StatusCodes.NOT_FOUND) { // eslint-disable-line no-lonely-if
|
|
52
|
+
const { favIcon } = (0, load_assets_1.default)(options.developmentMode);
|
|
53
|
+
await (0, safe_api_1.safeFulfillRequest)(client, {
|
|
54
|
+
requestId: event.requestId,
|
|
55
|
+
responseCode: http_status_codes_1.StatusCodes.OK,
|
|
56
|
+
responseHeaders: [constants_1.FAVICON_CONTENT_TYPE_HEADER],
|
|
57
|
+
body: (0, string_1.toBase64String)(favIcon),
|
|
58
|
+
}, sessionId);
|
|
59
|
+
}
|
|
60
|
+
else
|
|
61
|
+
await (0, safe_api_1.safeContinueResponse)(client, event, sessionId);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const SPECIAL_REQUEST_HANDLERS = [
|
|
66
|
+
internalRequest,
|
|
67
|
+
serviceRequest,
|
|
68
|
+
defaultFaviconRequest,
|
|
69
|
+
];
|
|
70
|
+
function getSpecialRequestHandler(event, options, serviceRoutes) {
|
|
71
|
+
const specialRequestHandler = SPECIAL_REQUEST_HANDLERS.find(h => h.condition(event, options, serviceRoutes));
|
|
72
|
+
return specialRequestHandler ? specialRequestHandler.handler : null;
|
|
73
|
+
}
|
|
74
|
+
exports.default = getSpecialRequestHandler;
|
|
75
|
+
module.exports = exports.default;
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC1oYW5kbGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uYXRpdmUtYXV0b21hdGlvbi9yZXF1ZXN0LXBpcGVsaW5lL3NwZWNpYWwtaGFuZGxlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwREFBZ0U7QUFPaEUsNkRBSW1DO0FBRW5DLHNDQUF5QztBQUN6QywyQ0FBMEQ7QUFDMUQseURBQWdEO0FBQ2hELG9FQUEyQztBQUMzQyw0Q0FBaUQ7QUFDakQseUNBSW9CO0FBRXBCLEtBQUssVUFBVSx1QkFBdUIsQ0FBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsU0FBb0I7SUFDeEcsSUFBSSxJQUFBLGVBQVMsRUFBQyxLQUFLLENBQUM7UUFDaEIsTUFBTSxJQUFBLDhCQUFtQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7O1FBRXBELE1BQU0sSUFBQSwrQkFBb0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFHRCxNQUFNLGVBQWUsR0FBRztJQUNwQixTQUFTLEVBQUUsQ0FBQyxLQUF5QixFQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7SUFDOUgsT0FBTyxFQUFJLEtBQUssRUFBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsT0FBb0MsRUFBRSxTQUFvQixFQUFpQixFQUFFO1FBQzNJLElBQUEsb0RBQW9DLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxELE1BQU0sdUJBQXVCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ2MsQ0FBQztBQUVwQixNQUFNLGNBQWMsR0FBRztJQUNuQixTQUFTLEVBQUUsQ0FBQyxLQUF5QixFQUFFLE9BQW9DLEVBQUUsYUFBbUMsRUFBVyxFQUFFO1FBQ3pILE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBRTlCLG9EQUFvRDtRQUNwRCxJQUFJLEdBQUcsS0FBSyxhQUFhLENBQUMsVUFBVTtlQUM3QixHQUFHLEtBQUssYUFBYSxDQUFDLFVBQVU7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFFakIsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsT0FBb0MsRUFBRSxTQUFvQixFQUFpQixFQUFFO1FBQ3pJLElBQUEsbURBQW1DLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpELE1BQU0sdUJBQXVCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ2MsQ0FBQztBQUVwQixNQUFNLHFCQUFxQixHQUFHO0lBQzFCLFNBQVMsRUFBRSxDQUFDLEtBQXlCLEVBQVcsRUFBRTtRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sU0FBUyxDQUFDLFFBQVEsS0FBSyxrQ0FBb0IsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUF5QixFQUFFLE1BQW1CLEVBQUUsT0FBb0MsRUFBRSxTQUFvQixFQUFpQixFQUFFO1FBQ3pJLElBQUEscUNBQXFCLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBQSxlQUFTLEVBQUMsS0FBSyxDQUFDO1lBQ2hCLE1BQU0sSUFBQSw4QkFBbUIsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssK0JBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxtQ0FBbUM7Z0JBQ3pGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLHFCQUFVLEVBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUV4RCxNQUFNLElBQUEsNkJBQWtCLEVBQUMsTUFBTSxFQUFFO29CQUM3QixTQUFTLEVBQVEsS0FBSyxDQUFDLFNBQVM7b0JBQ2hDLFlBQVksRUFBSywrQkFBVyxDQUFDLEVBQUU7b0JBQy9CLGVBQWUsRUFBRSxDQUFFLHVDQUEyQixDQUFFO29CQUNoRCxJQUFJLEVBQWEsSUFBQSx1QkFBYyxFQUFDLE9BQU8sQ0FBQztpQkFDM0MsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUNqQjs7Z0JBRUcsTUFBTSxJQUFBLCtCQUFvQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0NBQ2MsQ0FBQztBQUVwQixNQUFNLHdCQUF3QixHQUFHO0lBQzdCLGVBQWU7SUFDZixjQUFjO0lBQ2QscUJBQXFCO0NBQ3hCLENBQUM7QUFFRixTQUF3Qix3QkFBd0IsQ0FBRSxLQUF5QixFQUFFLE9BQXFDLEVBQUUsYUFBb0M7SUFDcEosTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU3RyxPQUFPLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN4RSxDQUFDO0FBSkQsMkNBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvdG9jb2wgZnJvbSAnZGV2dG9vbHMtcHJvdG9jb2wnO1xuaW1wb3J0IFJlcXVlc3RQYXVzZWRFdmVudCA9IFByb3RvY29sLkZldGNoLlJlcXVlc3RQYXVzZWRFdmVudDtcbmltcG9ydCB7IERFRkFVTFRfRkFWSUNPTl9QQVRIIH0gZnJvbSAnLi4vLi4vYXNzZXRzL2luamVjdGFibGVzJztcbmltcG9ydCB7XG4gICAgUmVxdWVzdEhhbmRsZXIsXG4gICAgU2Vzc2lvbklkLFxuICAgIFNwZWNpYWxTZXJ2aWNlUm91dGVzLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBQcm90b2NvbEFwaSB9IGZyb20gJ2Nocm9tZS1yZW1vdGUtaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gICAgcmVxdWVzdFBpcGVsaW5lSW50ZXJuYWxSZXF1ZXN0TG9nZ2VyLFxuICAgIHJlcXVlc3RQaXBlbGluZUxvZ2dlcixcbiAgICByZXF1ZXN0UGlwZWxpbmVTZXJ2aWNlUmVxdWVzdExvZ2dlcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZGVidWctbG9nZ2Vycyc7XG5pbXBvcnQgeyBOYXRpdmVBdXRvbWF0aW9uSW5pdE9wdGlvbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgaXNSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvY2RwJztcbmltcG9ydCB7IEZBVklDT05fQ09OVEVOVF9UWVBFX0hFQURFUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFN0YXR1c0NvZGVzIH0gZnJvbSAnaHR0cC1zdGF0dXMtY29kZXMnO1xuaW1wb3J0IGxvYWRBc3NldHMgZnJvbSAnLi4vLi4vbG9hZC1hc3NldHMnO1xuaW1wb3J0IHsgdG9CYXNlNjRTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgICBzYWZlQ29udGludWVSZXF1ZXN0LFxuICAgIHNhZmVDb250aW51ZVJlc3BvbnNlLFxuICAgIHNhZmVGdWxmaWxsUmVxdWVzdCxcbn0gZnJvbSAnLi9zYWZlLWFwaSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3RQYXVzZUV2ZW50IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50LCBjbGllbnQ6IFByb3RvY29sQXBpLCBzZXNzaW9uSWQ6IFNlc3Npb25JZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChpc1JlcXVlc3QoZXZlbnQpKVxuICAgICAgICBhd2FpdCBzYWZlQ29udGludWVSZXF1ZXN0KGNsaWVudCwgZXZlbnQsIHNlc3Npb25JZCk7XG4gICAgZWxzZVxuICAgICAgICBhd2FpdCBzYWZlQ29udGludWVSZXNwb25zZShjbGllbnQsIGV2ZW50LCBzZXNzaW9uSWQpO1xufVxuXG5cbmNvbnN0IGludGVybmFsUmVxdWVzdCA9IHtcbiAgICBjb25kaXRpb246IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogYm9vbGVhbiA9PiAhZXZlbnQubmV0d29ya0lkICYmIGV2ZW50LnJlc291cmNlVHlwZSAhPT0gJ0RvY3VtZW50JyAmJiAhZXZlbnQucmVxdWVzdC51cmwsXG4gICAgaGFuZGxlcjogICBhc3luYyAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgY2xpZW50OiBQcm90b2NvbEFwaSwgb3B0aW9uczogTmF0aXZlQXV0b21hdGlvbkluaXRPcHRpb25zLCBzZXNzaW9uSWQ6IFNlc3Npb25JZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICByZXF1ZXN0UGlwZWxpbmVJbnRlcm5hbFJlcXVlc3RMb2dnZXIoJyVyJywgZXZlbnQpO1xuXG4gICAgICAgIGF3YWl0IGhhbmRsZVJlcXVlc3RQYXVzZUV2ZW50KGV2ZW50LCBjbGllbnQsIHNlc3Npb25JZCk7XG4gICAgfSxcbn0gYXMgUmVxdWVzdEhhbmRsZXI7XG5cbmNvbnN0IHNlcnZpY2VSZXF1ZXN0ID0ge1xuICAgIGNvbmRpdGlvbjogKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2VydmljZVJvdXRlczogU3BlY2lhbFNlcnZpY2VSb3V0ZXMpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gZXZlbnQucmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gTk9URTogdGhlIHNlcnZpY2UgJ0Vycm9yIHBhZ2UnIHNob3VsZCBiZSBwcm94aWVkLlxuICAgICAgICBpZiAodXJsID09PSBzZXJ2aWNlUm91dGVzLmVycm9yUGFnZTFcbiAgICAgICAgICAgIHx8IHVybCA9PT0gc2VydmljZVJvdXRlcy5lcnJvclBhZ2UyKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLnNlcnZpY2VEb21haW5zLnNvbWUoZG9tYWluID0+IHVybC5zdGFydHNXaXRoKGRvbWFpbikpO1xuICAgIH0sXG4gICAgaGFuZGxlcjogYXN5bmMgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGksIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgcmVxdWVzdFBpcGVsaW5lU2VydmljZVJlcXVlc3RMb2dnZXIoJyVyJywgZXZlbnQpO1xuXG4gICAgICAgIGF3YWl0IGhhbmRsZVJlcXVlc3RQYXVzZUV2ZW50KGV2ZW50LCBjbGllbnQsIHNlc3Npb25JZCk7XG4gICAgfSxcbn0gYXMgUmVxdWVzdEhhbmRsZXI7XG5cbmNvbnN0IGRlZmF1bHRGYXZpY29uUmVxdWVzdCA9IHtcbiAgICBjb25kaXRpb246IChldmVudDogUmVxdWVzdFBhdXNlZEV2ZW50KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwoZXZlbnQucmVxdWVzdC51cmwpO1xuXG4gICAgICAgIHJldHVybiBwYXJzZWRVcmwucGF0aG5hbWUgPT09IERFRkFVTFRfRkFWSUNPTl9QQVRIO1xuICAgIH0sXG4gICAgaGFuZGxlcjogYXN5bmMgKGV2ZW50OiBSZXF1ZXN0UGF1c2VkRXZlbnQsIGNsaWVudDogUHJvdG9jb2xBcGksIG9wdGlvbnM6IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2Vzc2lvbklkOiBTZXNzaW9uSWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgcmVxdWVzdFBpcGVsaW5lTG9nZ2VyKCclcicsIGV2ZW50KTtcblxuICAgICAgICBpZiAoaXNSZXF1ZXN0KGV2ZW50KSlcbiAgICAgICAgICAgIGF3YWl0IHNhZmVDb250aW51ZVJlcXVlc3QoY2xpZW50LCBldmVudCwgc2Vzc2lvbklkKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQucmVzcG9uc2VTdGF0dXNDb2RlID09PSBTdGF0dXNDb2Rlcy5OT1RfRk9VTkQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZhdkljb24gfSA9IGxvYWRBc3NldHMob3B0aW9ucy5kZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgc2FmZUZ1bGZpbGxSZXF1ZXN0KGNsaWVudCwge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6ICAgICAgIGV2ZW50LnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb2RlOiAgICBTdGF0dXNDb2Rlcy5PSyxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiBbIEZBVklDT05fQ09OVEVOVF9UWVBFX0hFQURFUiBdLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAgICAgICAgICAgIHRvQmFzZTY0U3RyaW5nKGZhdkljb24pLFxuICAgICAgICAgICAgICAgIH0sIHNlc3Npb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYXdhaXQgc2FmZUNvbnRpbnVlUmVzcG9uc2UoY2xpZW50LCBldmVudCwgc2Vzc2lvbklkKTtcbiAgICAgICAgfVxuICAgIH0sXG59IGFzIFJlcXVlc3RIYW5kbGVyO1xuXG5jb25zdCBTUEVDSUFMX1JFUVVFU1RfSEFORExFUlMgPSBbXG4gICAgaW50ZXJuYWxSZXF1ZXN0LFxuICAgIHNlcnZpY2VSZXF1ZXN0LFxuICAgIGRlZmF1bHRGYXZpY29uUmVxdWVzdCxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNwZWNpYWxSZXF1ZXN0SGFuZGxlciAoZXZlbnQ6IFJlcXVlc3RQYXVzZWRFdmVudCwgb3B0aW9ucz86IE5hdGl2ZUF1dG9tYXRpb25Jbml0T3B0aW9ucywgc2VydmljZVJvdXRlcz86IFNwZWNpYWxTZXJ2aWNlUm91dGVzKTogYW55IHtcbiAgICBjb25zdCBzcGVjaWFsUmVxdWVzdEhhbmRsZXIgPSBTUEVDSUFMX1JFUVVFU1RfSEFORExFUlMuZmluZChoID0+IGguY29uZGl0aW9uKGV2ZW50LCBvcHRpb25zLCBzZXJ2aWNlUm91dGVzKSk7XG5cbiAgICByZXR1cm4gc3BlY2lhbFJlcXVlc3RIYW5kbGVyID8gc3BlY2lhbFJlcXVlc3RIYW5kbGVyLmhhbmRsZXIgOiBudWxsO1xufVxuXG4iXX0=
|