326 lines
40 KiB
JavaScript
326 lines
40 KiB
JavaScript
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
|
|
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
|
|
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
|
|
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
|
|
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
|
|
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
|
|
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
|
|
import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
|
|
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
|
|
import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck";
|
|
import _createClass from "@babel/runtime-corejs3/helpers/createClass";
|
|
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn";
|
|
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";
|
|
import _get from "@babel/runtime-corejs3/helpers/get";
|
|
import _inherits from "@babel/runtime-corejs3/helpers/inherits";
|
|
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
|
|
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
|
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
|
import "core-js/modules/es.error.cause.js";
|
|
import "core-js/modules/es.array.join.js";
|
|
import "core-js/modules/es.array.push.js";
|
|
import "core-js/modules/es.number.constructor.js";
|
|
import "core-js/modules/es.regexp.exec.js";
|
|
import "core-js/modules/es.regexp.test.js";
|
|
import "core-js/modules/es.string.replace.js";
|
|
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
|
|
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
|
|
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
|
|
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
|
|
import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with";
|
|
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
|
|
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
/**
|
|
* @file Manages method call to SOAP endpoint
|
|
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
|
|
*/
|
|
import HttpApi, { isBrowser } from './http-api';
|
|
import { isMapObject, isObject } from './util/function';
|
|
import { getBodySize } from './util/get-body-size';
|
|
import { isJWTToken } from './util/jwt';
|
|
|
|
/**
|
|
*
|
|
*/
|
|
function getPropsSchema(schema, schemaDict) {
|
|
if (schema.extends && schemaDict[schema.extends]) {
|
|
var extendSchema = schemaDict[schema.extends];
|
|
return _objectSpread(_objectSpread({}, getPropsSchema(extendSchema, schemaDict)), schema.props);
|
|
}
|
|
return schema.props;
|
|
}
|
|
function isNillValue(value) {
|
|
return value == null || isMapObject(value) && isMapObject(value.$) && value.$['xsi:nil'] === 'true';
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
export function castTypeUsingSchema(value, schema) {
|
|
var schemaDict = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
if (_Array$isArray(schema)) {
|
|
var _context;
|
|
var nillable = schema.length === 2 && schema[0] === '?';
|
|
var schema_ = nillable ? schema[1] : schema[0];
|
|
if (value == null) {
|
|
return nillable ? null : [];
|
|
}
|
|
return _mapInstanceProperty(_context = _Array$isArray(value) ? value : [value]).call(_context, function (v) {
|
|
return castTypeUsingSchema(v, schema_, schemaDict);
|
|
});
|
|
} else if (isMapObject(schema)) {
|
|
var _context2;
|
|
// if schema is Schema Definition, not schema element
|
|
if ('type' in schema && 'props' in schema && isMapObject(schema.props)) {
|
|
var props = getPropsSchema(schema, schemaDict);
|
|
return castTypeUsingSchema(value, props, schemaDict);
|
|
}
|
|
var _nillable = '?' in schema;
|
|
var _schema_ = '?' in schema ? schema['?'] : schema;
|
|
if (_nillable && isNillValue(value)) {
|
|
return null;
|
|
}
|
|
var obj = isMapObject(value) ? value : {};
|
|
return _reduceInstanceProperty(_context2 = _Object$keys(_schema_)).call(_context2, function (o, k) {
|
|
var s = _schema_[k];
|
|
var v = obj[k];
|
|
var nillable = _Array$isArray(s) && s.length === 2 && s[0] === '?' || isMapObject(s) && '?' in s || typeof s === 'string' && _startsWithInstanceProperty(s).call(s, '?');
|
|
if (typeof v === 'undefined' && nillable) {
|
|
return o;
|
|
}
|
|
return _objectSpread(_objectSpread({}, o), {}, _defineProperty({}, k, castTypeUsingSchema(v, s, schemaDict)));
|
|
}, obj);
|
|
} else {
|
|
var _nillable2 = typeof schema === 'string' && _startsWithInstanceProperty(schema).call(schema, '?');
|
|
var type = typeof schema === 'string' ? _nillable2 ? schema.substring(1) : schema : 'any';
|
|
switch (type) {
|
|
case 'string':
|
|
return isNillValue(value) ? _nillable2 ? null : '' : String(value);
|
|
case 'number':
|
|
return isNillValue(value) ? _nillable2 ? null : 0 : Number(value);
|
|
case 'boolean':
|
|
return isNillValue(value) ? _nillable2 ? null : false : value === 'true';
|
|
case 'null':
|
|
return null;
|
|
default:
|
|
{
|
|
if (schemaDict[type]) {
|
|
var cvalue = castTypeUsingSchema(value, schemaDict[type], schemaDict);
|
|
var isEmpty = isMapObject(cvalue) && _Object$keys(cvalue).length === 0;
|
|
return isEmpty && _nillable2 ? null : cvalue;
|
|
}
|
|
return value;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
function lookupValue(obj, propRegExps) {
|
|
var regexp = propRegExps.shift();
|
|
if (!regexp) {
|
|
return obj;
|
|
}
|
|
if (isMapObject(obj)) {
|
|
for (var _i = 0, _Object$keys2 = _Object$keys(obj); _i < _Object$keys2.length; _i++) {
|
|
var prop = _Object$keys2[_i];
|
|
if (regexp.test(prop)) {
|
|
return lookupValue(obj[prop], propRegExps);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
function toXML(name, value) {
|
|
if (isObject(name)) {
|
|
value = name;
|
|
name = null;
|
|
}
|
|
if (_Array$isArray(value)) {
|
|
return _mapInstanceProperty(value).call(value, function (v) {
|
|
return toXML(name, v);
|
|
}).join('');
|
|
} else {
|
|
var attrs = [];
|
|
if (value === null) {
|
|
attrs.push('xsi:nil="true"');
|
|
value = '';
|
|
} else if (isMapObject(value)) {
|
|
var elems = [];
|
|
for (var _i2 = 0, _Object$keys3 = _Object$keys(value); _i2 < _Object$keys3.length; _i2++) {
|
|
var k = _Object$keys3[_i2];
|
|
var v = value[k];
|
|
if (_startsWithInstanceProperty(k).call(k, '@')) {
|
|
var _context3;
|
|
var kk = k.substring(1);
|
|
attrs.push(_concatInstanceProperty(_context3 = "".concat(kk, "=\"")).call(_context3, v, "\""));
|
|
} else {
|
|
elems.push(toXML(k, v));
|
|
}
|
|
}
|
|
value = elems.join('');
|
|
} else {
|
|
value = String(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
}
|
|
var startTag = name ? '<' + name + (attrs.length > 0 ? ' ' + attrs.join(' ') : '') + '>' : '';
|
|
var endTag = name ? '</' + name + '>' : '';
|
|
return startTag + value + endTag;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Class for SOAP endpoint of Salesforce
|
|
*
|
|
* @protected
|
|
* @class
|
|
* @constructor
|
|
* @param {Connection} conn - Connection instance
|
|
* @param {Object} options - SOAP endpoint setting options
|
|
* @param {String} options.endpointUrl - SOAP endpoint URL
|
|
* @param {String} [options.xmlns] - XML namespace for method call (default is "urn:partner.soap.sforce.com")
|
|
*/
|
|
export var SOAP = /*#__PURE__*/function (_HttpApi) {
|
|
function SOAP(conn, options) {
|
|
var _this;
|
|
_classCallCheck(this, SOAP);
|
|
_this = _callSuper(this, SOAP, [conn, options]);
|
|
if (_this._conn.accessToken && isJWTToken(_this._conn.accessToken)) {
|
|
// We need to block SOAP requests with JWT tokens because the response is:
|
|
// statusCode=500 | body="INVALID_SESSION_ID" (xml), which triggers session refresh and enters in an infinite loop
|
|
throw new Error('SOAP API does not support JWT-based access tokens. You must disable the "Issue JSON Web Token (JWT)-based access tokens" setting in your Connected App or External Client App');
|
|
}
|
|
_this._endpointUrl = options.endpointUrl;
|
|
_this._xmlns = options.xmlns || 'urn:partner.soap.sforce.com';
|
|
return _this;
|
|
}
|
|
|
|
/**
|
|
* Invoke SOAP call using method and arguments
|
|
*/
|
|
_inherits(SOAP, _HttpApi);
|
|
return _createClass(SOAP, [{
|
|
key: "invoke",
|
|
value: (function () {
|
|
var _invoke = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, args, schema, schemaDict) {
|
|
var res;
|
|
return _regeneratorRuntime.wrap(function _callee$(_context4) {
|
|
while (1) switch (_context4.prev = _context4.next) {
|
|
case 0:
|
|
_context4.next = 2;
|
|
return this.request({
|
|
method: 'POST',
|
|
url: this._endpointUrl,
|
|
headers: {
|
|
'Content-Type': 'text/xml',
|
|
SOAPAction: '""'
|
|
},
|
|
_message: _defineProperty({}, method, args)
|
|
});
|
|
case 2:
|
|
res = _context4.sent;
|
|
return _context4.abrupt("return", schema ? castTypeUsingSchema(res, schema, schemaDict) : res);
|
|
case 4:
|
|
case "end":
|
|
return _context4.stop();
|
|
}
|
|
}, _callee, this);
|
|
}));
|
|
function invoke(_x, _x2, _x3, _x4) {
|
|
return _invoke.apply(this, arguments);
|
|
}
|
|
return invoke;
|
|
}() /** @override */)
|
|
}, {
|
|
key: "beforeSend",
|
|
value: function beforeSend(request) {
|
|
request.body = this._createEnvelope(request._message);
|
|
var headers = request.headers || {};
|
|
var bodySize = getBodySize(request.body, request.headers);
|
|
if (!isBrowser &&
|
|
// Don't set content-length in browsers as it's not allowed
|
|
request.method === 'POST' && !('transfer-encoding' in headers) && !('content-length' in headers) && !!bodySize) {
|
|
this._logger.debug("missing 'content-length' header, setting it to: ".concat(bodySize));
|
|
headers['content-length'] = String(bodySize);
|
|
}
|
|
request.headers = headers;
|
|
}
|
|
|
|
/** @override **/
|
|
}, {
|
|
key: "isSessionExpired",
|
|
value: function isSessionExpired(response) {
|
|
return response.statusCode === 500 && /<faultcode>[a-zA-Z]+:INVALID_SESSION_ID<\/faultcode>/.test(response.body);
|
|
}
|
|
|
|
/** @override **/
|
|
}, {
|
|
key: "parseError",
|
|
value: function parseError(body) {
|
|
var error = lookupValue(body, [/:Envelope$/, /:Body$/, /:Fault$/]);
|
|
return {
|
|
errorCode: error.faultcode,
|
|
message: error.faultstring
|
|
};
|
|
}
|
|
|
|
/** @override **/
|
|
}, {
|
|
key: "getResponseBody",
|
|
value: (function () {
|
|
var _getResponseBody = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(response) {
|
|
var body;
|
|
return _regeneratorRuntime.wrap(function _callee2$(_context5) {
|
|
while (1) switch (_context5.prev = _context5.next) {
|
|
case 0:
|
|
_context5.next = 2;
|
|
return _superPropGet(SOAP, "getResponseBody", this, 3)([response]);
|
|
case 2:
|
|
body = _context5.sent;
|
|
return _context5.abrupt("return", lookupValue(body, [/:Envelope$/, /:Body$/, /.+/]));
|
|
case 4:
|
|
case "end":
|
|
return _context5.stop();
|
|
}
|
|
}, _callee2, this);
|
|
}));
|
|
function getResponseBody(_x5) {
|
|
return _getResponseBody.apply(this, arguments);
|
|
}
|
|
return getResponseBody;
|
|
}()
|
|
/**
|
|
* @private
|
|
*/
|
|
)
|
|
}, {
|
|
key: "_createEnvelope",
|
|
value: function _createEnvelope(message) {
|
|
var header = {};
|
|
var conn = this._conn;
|
|
if (conn.accessToken) {
|
|
header.SessionHeader = {
|
|
sessionId: conn.accessToken
|
|
};
|
|
}
|
|
if (conn._callOptions) {
|
|
header.CallOptions = conn._callOptions;
|
|
}
|
|
return ['<?xml version="1.0" encoding="UTF-8"?>', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"', ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"', ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">', '<soapenv:Header xmlns="' + this._xmlns + '">', toXML(header), '</soapenv:Header>', '<soapenv:Body xmlns="' + this._xmlns + '">', toXML(message), '</soapenv:Body>', '</soapenv:Envelope>'].join('');
|
|
}
|
|
}]);
|
|
}(HttpApi);
|
|
export default SOAP;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJIdHRwQXBpIiwiaXNCcm93c2VyIiwiaXNNYXBPYmplY3QiLCJpc09iamVjdCIsImdldEJvZHlTaXplIiwiaXNKV1RUb2tlbiIsImdldFByb3BzU2NoZW1hIiwic2NoZW1hIiwic2NoZW1hRGljdCIsImV4dGVuZHMiLCJleHRlbmRTY2hlbWEiLCJfb2JqZWN0U3ByZWFkIiwicHJvcHMiLCJpc05pbGxWYWx1ZSIsInZhbHVlIiwiJCIsImNhc3RUeXBlVXNpbmdTY2hlbWEiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfQXJyYXkkaXNBcnJheSIsIl9jb250ZXh0IiwibmlsbGFibGUiLCJzY2hlbWFfIiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJjYWxsIiwidiIsIl9jb250ZXh0MiIsIm9iaiIsIl9yZWR1Y2VJbnN0YW5jZVByb3BlcnR5IiwiX09iamVjdCRrZXlzIiwibyIsImsiLCJzIiwiX3N0YXJ0c1dpdGhJbnN0YW5jZVByb3BlcnR5IiwiX2RlZmluZVByb3BlcnR5IiwidHlwZSIsInN1YnN0cmluZyIsIlN0cmluZyIsIk51bWJlciIsImN2YWx1ZSIsImlzRW1wdHkiLCJsb29rdXBWYWx1ZSIsInByb3BSZWdFeHBzIiwicmVnZXhwIiwic2hpZnQiLCJfaSIsIl9PYmplY3Qka2V5czIiLCJwcm9wIiwidGVzdCIsInRvWE1MIiwibmFtZSIsImpvaW4iLCJhdHRycyIsInB1c2giLCJlbGVtcyIsIl9pMiIsIl9PYmplY3Qka2V5czMiLCJfY29udGV4dDMiLCJrayIsIl9jb25jYXRJbnN0YW5jZVByb3BlcnR5IiwiY29uY2F0IiwicmVwbGFjZSIsInN0YXJ0VGFnIiwiZW5kVGFnIiwiU09BUCIsIl9IdHRwQXBpIiwiY29ubiIsIm9wdGlvbnMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJfY29ubiIsImFjY2Vzc1Rva2VuIiwiRXJyb3IiLCJfZW5kcG9pbnRVcmwiLCJlbmRwb2ludFVybCIsIl94bWxucyIsInhtbG5zIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwia2V5IiwiX2ludm9rZSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwibWV0aG9kIiwiYXJncyIsInJlcyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0NCIsInByZXYiLCJuZXh0IiwicmVxdWVzdCIsInVybCIsImhlYWRlcnMiLCJTT0FQQWN0aW9uIiwiX21lc3NhZ2UiLCJzZW50IiwiYWJydXB0Iiwic3RvcCIsImludm9rZSIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiYXBwbHkiLCJiZWZvcmVTZW5kIiwiYm9keSIsIl9jcmVhdGVFbnZlbG9wZSIsImJvZHlTaXplIiwiX2xvZ2dlciIsImRlYnVnIiwiaXNTZXNzaW9uRXhwaXJlZCIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsInBhcnNlRXJyb3IiLCJlcnJvciIsImVycm9yQ29kZSIsImZhdWx0Y29kZSIsIm1lc3NhZ2UiLCJmYXVsdHN0cmluZyIsIl9nZXRSZXNwb25zZUJvZHkiLCJfY2FsbGVlMiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0NSIsIl9zdXBlclByb3BHZXQiLCJnZXRSZXNwb25zZUJvZHkiLCJfeDUiLCJoZWFkZXIiLCJTZXNzaW9uSGVhZGVyIiwic2Vzc2lvbklkIiwiX2NhbGxPcHRpb25zIiwiQ2FsbE9wdGlvbnMiXSwic291cmNlcyI6WyIuLi9zcmMvc29hcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIE1hbmFnZXMgbWV0aG9kIGNhbGwgdG8gU09BUCBlbmRwb2ludFxuICogQGF1dGhvciBTaGluaWNoaSBUb21pdGEgPHNoaW5pY2hpLnRvbWl0YUBnbWFpbC5jb20+XG4gKi9cbmltcG9ydCBIdHRwQXBpLCB7IGlzQnJvd3NlciB9IGZyb20gJy4vaHR0cC1hcGknO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi9jb25uZWN0aW9uJztcbmltcG9ydCB7XG4gIFNjaGVtYSxcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwUmVxdWVzdCxcbiAgU29hcFNjaGVtYSxcbiAgU29hcFNjaGVtYURlZixcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBpc01hcE9iamVjdCwgaXNPYmplY3QgfSBmcm9tICcuL3V0aWwvZnVuY3Rpb24nO1xuaW1wb3J0IHsgZ2V0Qm9keVNpemUgfSBmcm9tICcuL3V0aWwvZ2V0LWJvZHktc2l6ZSc7XG5pbXBvcnQgeyBpc0pXVFRva2VuIH0gZnJvbSAnLi91dGlsL2p3dCc7XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcHNTY2hlbWEoXG4gIHNjaGVtYTogU29hcFNjaGVtYURlZixcbiAgc2NoZW1hRGljdDogeyBbbmFtZTogc3RyaW5nXTogU29hcFNjaGVtYURlZiB9LFxuKTogU29hcFNjaGVtYURlZlsncHJvcHMnXSB7XG4gIGlmIChzY2hlbWEuZXh0ZW5kcyAmJiBzY2hlbWFEaWN0W3NjaGVtYS5leHRlbmRzXSkge1xuICAgIGNvbnN0IGV4dGVuZFNjaGVtYSA9IHNjaGVtYURpY3Rbc2NoZW1hLmV4dGVuZHNdO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5nZXRQcm9wc1NjaGVtYShleHRlbmRTY2hlbWEsIHNjaGVtYURpY3QpLFxuICAgICAgLi4uc2NoZW1hLnByb3BzLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5wcm9wcztcbn1cblxuZnVuY3Rpb24gaXNOaWxsVmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgKGlzTWFwT2JqZWN0KHZhbHVlKSAmJlxuICAgICAgaXNNYXBPYmplY3QodmFsdWUuJCkgJiZcbiAgICAgIHZhbHVlLiRbJ3hzaTpuaWwnXSA9PT0gJ3RydWUnKVxuICApO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXN0VHlwZVVzaW5nU2NoZW1hKFxuICB2YWx1ZTogdW5rbm93bixcbiAgc2NoZW1hPzogU29hcFNjaGVtYSB8IFNvYXBTY2hlbWFEZWYsXG4gIHNjaGVtYURpY3Q6IHsgW25hbWU6IHN0cmluZ106IFNvYXBTY2hlbWFEZWYgfSA9IHt9LFxuKTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgIGNvbnN0IG5pbGxhYmxlID0gc2NoZW1hLmxlbmd0aCA9PT0gMiAmJiBzY2hlbWFbMF0gPT09ICc/JztcbiAgICBjb25zdCBzY2hlbWFfID0gbmlsbGFibGUgPyBzY2hlbWFbMV0gOiBzY2hlbWFbMF07XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuaWxsYWJsZSA/IG51bGwgOiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkubWFwKCh2KSA9PlxuICAgICAgY2FzdFR5cGVVc2luZ1NjaGVtYSh2LCBzY2hlbWFfLCBzY2hlbWFEaWN0KSxcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAvLyBpZiBzY2hlbWEgaXMgU2NoZW1hIERlZmluaXRpb24sIG5vdCBzY2hlbWEgZWxlbWVudFxuICAgIGlmICgndHlwZScgaW4gc2NoZW1hICYmICdwcm9wcycgaW4gc2NoZW1hICYmIGlzTWFwT2JqZWN0KHNjaGVtYS5wcm9wcykpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gZ2V0UHJvcHNTY2hlbWEoc2NoZW1hIGFzIFNvYXBTY2hlbWFEZWYsIHNjaGVtYURpY3QpO1xuICAgICAgcmV0dXJuIGNhc3RUeXBlVXNpbmdTY2hlbWEodmFsdWUsIHByb3BzLCBzY2hlbWFEaWN0KTtcbiAgICB9XG4gICAgY29uc3QgbmlsbGFibGUgPSAnPycgaW4gc2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYV8gPVxuICAgICAgJz8nIGluIHNjaGVtYSA/IChzY2hlbWFbJz8nXSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA6IHNjaGVtYTtcbiAgICBpZiAobmlsbGFibGUgJiYgaXNOaWxsVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgb2JqID0gaXNNYXBPYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hXykucmVkdWNlKChvLCBrKSA9PiB7XG4gICAgICBjb25zdCBzID0gc2NoZW1hX1trXTtcbiAgICAgIGNvbnN0IHYgPSBvYmpba107XG4gICAgICBjb25zdCBuaWxsYWJsZSA9XG4gICAgICAgIChBcnJheS5pc0FycmF5KHMpICYmIHMubGVuZ3RoID09PSAyICYmIHNbMF0gPT09ICc/JykgfHxcbiAgICAgICAgKGlzTWFwT2JqZWN0KHMpICYmICc/JyBpbiBzKSB8fFxuICAgICAgICAodHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMuc3RhcnRzV2l0aCgnPycpKTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3VuZGVmaW5lZCcgJiYgbmlsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG87XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vLFxuICAgICAgICBba106IGNhc3RUeXBlVXNpbmdTY2hlbWEodiwgcywgc2NoZW1hRGljdCksXG4gICAgICB9O1xuICAgIH0sIG9iaik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmlsbGFibGUgPSB0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEuc3RhcnRzV2l0aCgnPycpO1xuICAgIGNvbnN0IHR5cGUgPVxuICAgICAgdHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgID8gc2NoZW1hLnN1YnN0cmluZygxKVxuICAgICAgICAgIDogc2NoZW1hXG4gICAgICAgIDogJ2FueSc7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6ICcnKSA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpID8gKG5pbGxhYmxlID8gbnVsbCA6IDApIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gaXNOaWxsVmFsdWUodmFsdWUpXG4gICAgICAgICAgPyBuaWxsYWJsZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAoc2NoZW1hRGljdFt0eXBlXSkge1xuICAgICAgICAgIGNvbnN0IGN2YWx1ZSA9IGNhc3RUeXBlVXNpbmdTY2hlbWEoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHNjaGVtYURpY3RbdHlwZV0sXG4gICAgICAgICAgICBzY2hlbWFEaWN0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9XG4gICAgICAgICAgICBpc01hcE9iamVjdChjdmFsdWUpICYmIE9iamVjdC5rZXlzKGN2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgICAgIHJldHVybiBpc0VtcHR5ICYmIG5pbGxhYmxlID8gbnVsbCA6IGN2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvb2t1cFZhbHVlKG9iajogdW5rbm93biwgcHJvcFJlZ0V4cHM6IFJlZ0V4cFtdKTogdW5rbm93biB7XG4gIGNvbnN0IHJlZ2V4cCA9IHByb3BSZWdFeHBzLnNoaWZ0KCk7XG4gIGlmICghcmVnZXhwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAoaXNNYXBPYmplY3Qob2JqKSkge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICBpZiAocmVnZXhwLnRlc3QocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGxvb2t1cFZhbHVlKG9ialtwcm9wXSwgcHJvcFJlZ0V4cHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvWE1MKG5hbWU6IG9iamVjdCB8IHN0cmluZyB8IG51bGwsIHZhbHVlPzogYW55KTogc3RyaW5nIHtcbiAgaWYgKGlzT2JqZWN0KG5hbWUpKSB7XG4gICAgdmFsdWUgPSBuYW1lO1xuICAgIG5hbWUgPSBudWxsO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKHYpID0+IHRvWE1MKG5hbWUsIHYpKS5qb2luKCcnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhdHRycyA9IFtdO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYXR0cnMucHVzaCgneHNpOm5pbD1cInRydWVcIicpO1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2UgaWYgKGlzTWFwT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZWxlbXMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgdiA9IHZhbHVlW2tdO1xuICAgICAgICBpZiAoay5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICBjb25zdCBrayA9IGsuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgIGF0dHJzLnB1c2goYCR7a2t9PVwiJHt2IGFzIHN0cmluZ31cImApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1zLnB1c2godG9YTUwoaywgdikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGVsZW1zLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgICAgLnJlcGxhY2UoLycvZywgJyZhcG9zOycpO1xuICAgIH1cbiAgICBjb25zdCBzdGFydFRhZyA9IG5hbWVcbiAgICAgID8gJzwnICsgbmFtZSArIChhdHRycy5sZW5ndGggPiAwID8gJyAnICsgYXR0cnMuam9pbignICcpIDogJycpICsgJz4nXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGVuZFRhZyA9IG5hbWUgPyAnPC8nICsgbmFtZSArICc+JyA6ICcnO1xuICAgIHJldHVybiBzdGFydFRhZyArIHZhbHVlICsgZW5kVGFnO1xuICB9XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IHR5cGUgU09BUE9wdGlvbnMgPSB7XG4gIGVuZHBvaW50VXJsOiBzdHJpbmc7XG4gIHhtbG5zPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBDbGFzcyBmb3IgU09BUCBlbmRwb2ludCBvZiBTYWxlc2ZvcmNlXG4gKlxuICogQHByb3RlY3RlZFxuICogQGNsYXNzXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubiAtIENvbm5lY3Rpb24gaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gU09BUCBlbmRwb2ludCBzZXR0aW5nIG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmVuZHBvaW50VXJsIC0gU09BUCBlbmRwb2ludCBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy54bWxuc10gLSBYTUwgbmFtZXNwYWNlIGZvciBtZXRob2QgY2FsbCAoZGVmYXVsdCBpcyBcInVybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbVwiKVxuICovXG5leHBvcnQgY2xhc3MgU09BUDxTIGV4dGVuZHMgU2NoZW1hPiBleHRlbmRzIEh0dHBBcGk8Uz4ge1xuICBfZW5kcG9pbnRVcmw6IHN0cmluZztcbiAgX3htbG5zOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29ubjogQ29ubmVjdGlvbjxTPiwgb3B0aW9uczogU09BUE9wdGlvbnMpIHtcbiAgICBzdXBlcihjb25uLCBvcHRpb25zKTtcbiAgICBpZiAodGhpcy5fY29ubi5hY2Nlc3NUb2tlbiAmJiBpc0pXVFRva2VuKHRoaXMuX2Nvbm4uYWNjZXNzVG9rZW4pKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGJsb2NrIFNPQVAgcmVxdWVzdHMgd2l0aCBKV1QgdG9rZW5zIGJlY2F1c2UgdGhlIHJlc3BvbnNlIGlzOlxuICAgICAgLy8gc3RhdHVzQ29kZT01MDAgfCBib2R5PVwiSU5WQUxJRF9TRVNTSU9OX0lEXCIgKHhtbCksIHdoaWNoIHRyaWdnZXJzIHNlc3Npb24gcmVmcmVzaCBhbmQgZW50ZXJzIGluIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1NPQVAgQVBJIGRvZXMgbm90IHN1cHBvcnQgSldULWJhc2VkIGFjY2VzcyB0b2tlbnMuIFlvdSBtdXN0IGRpc2FibGUgdGhlIFwiSXNzdWUgSlNPTiBXZWIgVG9rZW4gKEpXVCktYmFzZWQgYWNjZXNzIHRva2Vuc1wiIHNldHRpbmcgaW4geW91ciBDb25uZWN0ZWQgQXBwIG9yIEV4dGVybmFsIENsaWVudCBBcHAnLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fZW5kcG9pbnRVcmwgPSBvcHRpb25zLmVuZHBvaW50VXJsO1xuICAgIHRoaXMuX3htbG5zID0gb3B0aW9ucy54bWxucyB8fCAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgU09BUCBjYWxsIHVzaW5nIG1ldGhvZCBhbmQgYXJndW1lbnRzXG4gICAqL1xuICBhc3luYyBpbnZva2UoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgYXJnczogb2JqZWN0LFxuICAgIHNjaGVtYT86IFNvYXBTY2hlbWEgfCBTb2FwU2NoZW1hRGVmLFxuICAgIHNjaGVtYURpY3Q/OiB7IFtuYW1lOiBzdHJpbmddOiBTb2FwU2NoZW1hRGVmIH0sXG4gICkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucmVxdWVzdCh7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHVybDogdGhpcy5fZW5kcG9pbnRVcmwsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC94bWwnLFxuICAgICAgICBTT0FQQWN0aW9uOiAnXCJcIicsXG4gICAgICB9LFxuICAgICAgX21lc3NhZ2U6IHsgW21ldGhvZF06IGFyZ3MgfSxcbiAgICB9IGFzIEh0dHBSZXF1ZXN0KTtcbiAgICByZXR1cm4gc2NoZW1hID8gY2FzdFR5cGVVc2luZ1NjaGVtYShyZXMsIHNjaGVtYSwgc2NoZW1hRGljdCkgOiByZXM7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICovXG4gIGJlZm9yZVNlbmQocmVxdWVzdDogSHR0cFJlcXVlc3QgJiB7IF9tZXNzYWdlOiBvYmplY3QgfSkge1xuICAgIHJlcXVlc3QuYm9keSA9IHRoaXMuX2NyZWF0ZUVudmVsb3BlKHJlcXVlc3QuX21lc3NhZ2UpO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycyB8fCB7fTtcblxuICAgIGNvbnN0IGJvZHlTaXplID0gZ2V0Qm9keVNpemUocmVxdWVzdC5ib2R5LCByZXF1ZXN0LmhlYWRlcnMpO1xuXG4gICAgaWYgKFxuICAgICAgIWlzQnJvd3NlciAmJiAvLyBEb24ndCBzZXQgY29udGVudC1sZW5ndGggaW4gYnJvd3NlcnMgYXMgaXQncyBub3QgYWxsb3dlZFxuICAgICAgcmVxdWVzdC5tZXRob2QgPT09ICdQT1NUJyAmJlxuICAgICAgISgndHJhbnNmZXItZW5jb2RpbmcnIGluIGhlYWRlcnMpICYmXG4gICAgICAhKCdjb250ZW50LWxlbmd0aCcgaW4gaGVhZGVycykgJiZcbiAgICAgICEhYm9keVNpemVcbiAgICApIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYG1pc3NpbmcgJ2NvbnRlbnQtbGVuZ3RoJyBoZWFkZXIsIHNldHRpbmcgaXQgdG86ICR7Ym9keVNpemV9YCxcbiAgICAgICk7XG4gICAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gU3RyaW5nKGJvZHlTaXplKTtcbiAgICB9XG5cbiAgICByZXF1ZXN0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqKi9cbiAgaXNTZXNzaW9uRXhwaXJlZChyZXNwb25zZTogSHR0cFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDUwMCAmJlxuICAgICAgLzxmYXVsdGNvZGU+W2EtekEtWl0rOklOVkFMSURfU0VTU0lPTl9JRDxcXC9mYXVsdGNvZGU+Ly50ZXN0KHJlc3BvbnNlLmJvZHkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAb3ZlcnJpZGUgKiovXG4gIHBhcnNlRXJyb3IoYm9keTogc3RyaW5nKSB7XG4gICAgY29uc3QgZXJyb3IgPSBsb29rdXBWYWx1ZShib2R5LCBbLzpFbnZlbG9wZSQvLCAvOkJvZHkkLywgLzpGYXVsdCQvXSkgYXMge1xuICAgICAgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvckNvZGU6IGVycm9yLmZhdWx0Y29kZSxcbiAgICAgIG1lc3NhZ2U6IGVycm9yLmZhdWx0c3RyaW5nLFxuICAgIH07XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICoqL1xuICBhc3luYyBnZXRSZXNwb25zZUJvZHkocmVzcG9uc2U6IEh0dHBSZXNwb25zZSkge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBzdXBlci5nZXRSZXNwb25zZUJvZHkocmVzcG9uc2UpO1xuICAgIHJldHVybiBsb29rdXBWYWx1ZShib2R5LCBbLzpFbnZlbG9wZSQvLCAvOkJvZHkkLywgLy4rL10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlRW52ZWxvcGUobWVzc2FnZTogb2JqZWN0KSB7XG4gICAgY29uc3QgaGVhZGVyOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IGNvbm4gPSB0aGlzLl9jb25uO1xuICAgIGlmIChjb25uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICBoZWFkZXIuU2Vzc2lvbkhlYWRlciA9IHsgc2Vzc2lvbklkOiBjb25uLmFjY2Vzc1Rva2VuIH07XG4gICAgfVxuICAgIGlmIChjb25uLl9jYWxsT3B0aW9ucykge1xuICAgICAgaGVhZGVyLkNhbGxPcHRpb25zID0gY29ubi5fY2FsbE9wdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAnPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+JyxcbiAgICAgICc8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIicsXG4gICAgICAnIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCInLFxuICAgICAgJyB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiPicsXG4gICAgICAnPHNvYXBlbnY6SGVhZGVyIHhtbG5zPVwiJyArIHRoaXMuX3htbG5zICsgJ1wiPicsXG4gICAgICB0b1hNTChoZWFkZXIpLFxuICAgICAgJzwvc29hcGVudjpIZWFkZXI+JyxcbiAgICAgICc8c29hcGVudjpCb2R5IHhtbG5zPVwiJyArIHRoaXMuX3htbG5zICsgJ1wiPicsXG4gICAgICB0b1hNTChtZXNzYWdlKSxcbiAgICAgICc8L3NvYXBlbnY6Qm9keT4nLFxuICAgICAgJzwvc29hcGVudjpFbnZlbG9wZT4nLFxuICAgIF0uam9pbignJyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU09BUDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLE9BQU8sSUFBSUMsU0FBUyxRQUFRLFlBQVk7QUFTL0MsU0FBU0MsV0FBVyxFQUFFQyxRQUFRLFFBQVEsaUJBQWlCO0FBQ3ZELFNBQVNDLFdBQVcsUUFBUSxzQkFBc0I7QUFDbEQsU0FBU0MsVUFBVSxRQUFRLFlBQVk7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLGNBQWNBLENBQ3JCQyxNQUFxQixFQUNyQkMsVUFBNkMsRUFDckI7RUFDeEIsSUFBSUQsTUFBTSxDQUFDRSxPQUFPLElBQUlELFVBQVUsQ0FBQ0QsTUFBTSxDQUFDRSxPQUFPLENBQUMsRUFBRTtJQUNoRCxJQUFNQyxZQUFZLEdBQUdGLFVBQVUsQ0FBQ0QsTUFBTSxDQUFDRSxPQUFPLENBQUM7SUFDL0MsT0FBQUUsYUFBQSxDQUFBQSxhQUFBLEtBQ0tMLGNBQWMsQ0FBQ0ksWUFBWSxFQUFFRixVQUFVLENBQUMsR0FDeENELE1BQU0sQ0FBQ0ssS0FBSztFQUVuQjtFQUNBLE9BQU9MLE1BQU0sQ0FBQ0ssS0FBSztBQUNyQjtBQUVBLFNBQVNDLFdBQVdBLENBQUNDLEtBQWMsRUFBRTtFQUNuQyxPQUNFQSxLQUFLLElBQUksSUFBSSxJQUNaWixXQUFXLENBQUNZLEtBQUssQ0FBQyxJQUNqQlosV0FBVyxDQUFDWSxLQUFLLENBQUNDLENBQUMsQ0FBQyxJQUNwQkQsS0FBSyxDQUFDQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssTUFBTztBQUVwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLG1CQUFtQkEsQ0FDakNGLEtBQWMsRUFDZFAsTUFBbUMsRUFFOUI7RUFBQSxJQURMQyxVQUE2QyxHQUFBUyxTQUFB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
|