@glimmer/syntax
Version:
297 lines (272 loc) • 23.3 kB
JavaScript
/**
* A free variable is resolved according to a resolution rule:
*
* 1. Strict resolution
* 2. Namespaced resolution
* 3. Fallback resolution
*/
/**
* Strict resolution is used:
*
* 1. in a strict mode template
* 2. in an unambiguous invocation with dot paths
*/
export var StrictResolution = /*#__PURE__*/function () {
function StrictResolution() {
this.isAngleBracket = false;
}
var _proto = StrictResolution.prototype;
_proto.resolution = function resolution() {
return 31
/* GetStrictFree */
;
};
_proto.serialize = function serialize() {
return 'Strict';
};
return StrictResolution;
}();
export var STRICT_RESOLUTION = new StrictResolution();
/**
* A `LooseModeResolution` includes:
*
* - 0 or more namespaces to resolve the variable in
* - optional fallback behavior
*
* In practice, there are a limited number of possible combinations of these degrees of freedom,
* and they are captured by the `Ambiguity` union below.
*/
export var LooseModeResolution = /*#__PURE__*/function () {
function LooseModeResolution(ambiguity, isAngleBracket) {
if (isAngleBracket === void 0) {
isAngleBracket = false;
}
this.ambiguity = ambiguity;
this.isAngleBracket = isAngleBracket;
}
/**
* Namespaced resolution is used in an unambiguous syntax position:
*
* 1. `(sexp)` (namespace: `Helper`)
* 2. `{{#block}}` (namespace: `Component`)
* 3. `<a {{modifier}}>` (namespace: `Modifier`)
* 4. `<Component />` (namespace: `Component`)
*
* @see {NamespacedAmbiguity}
*/
LooseModeResolution.namespaced = function namespaced(namespace, isAngleBracket) {
if (isAngleBracket === void 0) {
isAngleBracket = false;
}
return new LooseModeResolution({
namespaces: [namespace],
fallback: false
}, isAngleBracket);
}
/**
* Fallback resolution is used when no namespaced resolutions are possible, but fallback
* resolution is still allowed.
*
* ```hbs
* {{x.y}}
* ```
*
* @see {FallbackAmbiguity}
*/
;
LooseModeResolution.fallback = function fallback() {
return new LooseModeResolution({
namespaces: [],
fallback: true
});
}
/**
* Append resolution is used when the variable should be resolved in both the `component` and
* `helper` namespaces. Fallback resolution is optional.
*
* ```hbs
* {{x}}
* ```
*
* ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution.
*
* ```hbs
* {{x y}}
* ```
*
* ^ `x` should be resolved in the `component` and `helper` namespaces without fallback
* resolution.
*
* @see {ComponentOrHelperAmbiguity}
*/
;
LooseModeResolution.append = function append(_ref) {
var invoke = _ref.invoke;
return new LooseModeResolution({
namespaces: ["Component"
/* Component */
, "Helper"
/* Helper */
],
fallback: !invoke
});
}
/**
* Trusting append resolution is used when the variable should be resolved in both the `component` and
* `helper` namespaces. Fallback resolution is optional.
*
* ```hbs
* {{{x}}}
* ```
*
* ^ `x` should be resolved in the `component` and `helper` namespaces with fallback resolution.
*
* ```hbs
* {{{x y}}}
* ```
*
* ^ `x` should be resolved in the `component` and `helper` namespaces without fallback
* resolution.
*
* @see {HelperAmbiguity}
*/
;
LooseModeResolution.trustingAppend = function trustingAppend(_ref2) {
var invoke = _ref2.invoke;
return new LooseModeResolution({
namespaces: ["Helper"
/* Helper */
],
fallback: !invoke
});
}
/**
* Attribute resolution is used when the variable should be resolved as a `helper` with fallback
* resolution.
*
* ```hbs
* <a href={{x}} />
* <a href="{{x}}.html" />
* ```
*
* ^ resolved in the `helper` namespace with fallback
*
* @see {HelperAmbiguity}
*/
;
LooseModeResolution.attr = function attr() {
return new LooseModeResolution({
namespaces: ["Helper"
/* Helper */
],
fallback: true
});
};
var _proto2 = LooseModeResolution.prototype;
_proto2.resolution = function resolution() {
if (this.ambiguity.namespaces.length === 0) {
return 31
/* GetStrictFree */
;
} else if (this.ambiguity.namespaces.length === 1) {
if (this.ambiguity.fallback) {
// simple namespaced resolution with fallback must be attr={{x}}
return 36
/* GetFreeAsHelperHeadOrThisFallback */
;
} else {
// simple namespaced resolution without fallback
switch (this.ambiguity.namespaces[0]) {
case "Helper"
/* Helper */
:
return 37
/* GetFreeAsHelperHead */
;
case "Modifier"
/* Modifier */
:
return 38
/* GetFreeAsModifierHead */
;
case "Component"
/* Component */
:
return 39
/* GetFreeAsComponentHead */
;
}
}
} else if (this.ambiguity.fallback) {
// component or helper + fallback ({{something}})
return 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
;
} else {
// component or helper without fallback ({{something something}})
return 35
/* GetFreeAsComponentOrHelperHead */
;
}
};
_proto2.serialize = function serialize() {
if (this.ambiguity.namespaces.length === 0) {
return 'Loose';
} else if (this.ambiguity.namespaces.length === 1) {
if (this.ambiguity.fallback) {
// simple namespaced resolution with fallback must be attr={{x}}
return ['ambiguous', "Attr"
/* Attr */
];
} else {
return ['ns', this.ambiguity.namespaces[0]];
}
} else if (this.ambiguity.fallback) {
// component or helper + fallback ({{something}})
return ['ambiguous', "Append"
/* Append */
];
} else {
// component or helper without fallback ({{something something}})
return ['ambiguous', "Invoke"
/* Invoke */
];
}
};
return LooseModeResolution;
}();
export var ARGUMENT_RESOLUTION = LooseModeResolution.fallback();
export function loadResolution(resolution) {
if (typeof resolution === 'string') {
switch (resolution) {
case 'Loose':
return LooseModeResolution.fallback();
case 'Strict':
return STRICT_RESOLUTION;
}
}
switch (resolution[0]) {
case 'ambiguous':
switch (resolution[1]) {
case "Append"
/* Append */
:
return LooseModeResolution.append({
invoke: false
});
case "Attr"
/* Attr */
:
return LooseModeResolution.attr();
case "Invoke"
/* Invoke */
:
return LooseModeResolution.append({
invoke: true
});
}
case 'ns':
return LooseModeResolution.namespaced(resolution[1]);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9vYmplY3RzL3Jlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FBVUE7Ozs7OztBQU1BLFdBQU0sZ0JBQU47QUFBQSw4QkFBQTtBQVNXLFNBQUEsY0FBQSxHQUFBLEtBQUE7QUFDVjs7QUFWRDs7QUFBQSxTQUNFLFVBREYsR0FDRSxzQkFBVTtBQUNSLFdBQUE7QUFBQTtBQUFBO0FBQ0QsR0FISDs7QUFBQSxTQUtFLFNBTEYsR0FLRSxxQkFBUztBQUNQLFdBQUEsUUFBQTtBQUNELEdBUEg7O0FBQUE7QUFBQTtBQVlBLE9BQU8sSUFBTSxpQkFBaUIsR0FBRyxJQUExQixnQkFBMEIsRUFBMUI7QUFFUDs7Ozs7Ozs7OztBQVNBLFdBQU0sbUJBQU47QUF3R0UsK0JBQUEsU0FBQSxFQUFvRCxjQUFwRCxFQUEwRTtBQUFBLFFBQXRCLGNBQXNCO0FBQXRCLE1BQUEsY0FBc0IsR0FBMUUsS0FBMEU7QUFBQTs7QUFBckQsU0FBQSxTQUFBLEdBQUEsU0FBQTtBQUErQixTQUFBLGNBQUEsR0FBQSxjQUFBO0FBQTBCO0FBdkc5RTs7Ozs7Ozs7Ozs7O0FBREYsc0JBV0UsVUFYRixHQVdFLG9CQUFBLFNBQUEsRUFBK0MsY0FBL0MsRUFBcUU7QUFBQSxRQUF0QixjQUFzQjtBQUF0QixNQUFBLGNBQXNCLEdBQXJFLEtBQXFFO0FBQUE7O0FBQ25FLFdBQU8sSUFBQSxtQkFBQSxDQUNMO0FBQ0UsTUFBQSxVQUFVLEVBQUUsQ0FEZCxTQUNjLENBRGQ7QUFFRSxNQUFBLFFBQVEsRUFBRTtBQUZaLEtBREssRUFBUCxjQUFPLENBQVA7QUFPRDtBQUVEOzs7Ozs7Ozs7O0FBckJGOztBQUFBLHNCQStCRSxRQS9CRixHQStCRSxvQkFBZTtBQUNiLFdBQU8sSUFBQSxtQkFBQSxDQUF3QjtBQUFFLE1BQUEsVUFBVSxFQUFaLEVBQUE7QUFBa0IsTUFBQSxRQUFR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QUF5RDtBQUM3RCxNQUFJLE9BQUEsVUFBQSxLQUFKLFFBQUEsRUFBb0M7QUFDbEMsWUFBQSxVQUFBO0FBQ0UsV0FBQSxPQUFBO0FBQ0UsZUFBTyxtQkFBbUIsQ0FBMUIsUUFBTyxFQUFQOztBQUNGLFdBQUEsUUFBQTtBQUNFLGVBQUEsaUJBQUE7QUFKSjtBQU1EOztBQUVELFVBQVEsVUFBVSxDQUFsQixDQUFrQixDQUFsQjtBQUNFLFNBQUEsV0FBQTtBQUNFLGNBQVEsVUFBVSxDQUFsQixDQUFrQixDQUFsQjtBQUNFLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sbUJBQW1CLENBQW5CLE1BQUEsQ0FBMkI7QUFBRSxZQUFBLE1BQU0sRUFBRTtBQUFWLFdBQTNCLENBQVA7O0FBQ0YsYUFBQTtBQUFBO0FBQUE7QUFDRSxpQkFBTyxtQkFBbUIsQ0FBMUIsSUFBTyxFQUFQOztBQUNGLGFBQUE7QUFBQTtBQUFBO0FBQ0UsaUJBQU8sbUJBQW1CLENBQW5CLE1BQUEsQ0FBMkI7QUFBRSxZQUFBLE1BQU0sRUFBRTtBQUFWLFdBQTNCLENBQVA7QUFOSjs7QUFTRixTQUFBLElBQUE7QUFDRSxhQUFPLG1CQUFtQixDQUFuQixVQUFBLENBQStCLFVBQVUsQ0FBaEQsQ0FBZ0QsQ0FBekMsQ0FBUDtBQVpKO0FBY0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnJlZSB2YXJpYWJsZSBpcyByZXNvbHZlZCBhY2NvcmRpbmcgdG8gYSByZXNvbHV0aW9uIHJ1bGU6XG4gKlxuICogMS4gU3RyaWN0IHJlc29sdXRpb25cbiAqIDIuIE5hbWVzcGFjZWQgcmVzb2x1dGlvblxuICogMy4gRmFsbGJhY2sgcmVzb2x1dGlvblxuICovXG5cbmltcG9ydCB7IEdldENvbnRleHR1YWxGcmVlT3AsIFNleHBPcGNvZGVzIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogU3RyaWN0IHJlc29sdXRpb24gaXMgdXNlZDpcbiAqXG4gKiAxLiBpbiBhIHN0cmljdCBtb2RlIHRlbXBsYXRlXG4gKiAyLiBpbiBhbiB1bmFtYmlndW91cyBpbnZvY2F0aW9uIHdpdGggZG90IHBhdGhzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpY3RSZXNvbHV0aW9uIHtcbiAgcmVzb2x1dGlvbigpOiBHZXRDb250ZXh0dWFsRnJlZU9wIHtcbiAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0U3RyaWN0RnJlZTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuICdTdHJpY3QnO1xuICB9XG5cbiAgcmVhZG9ubHkgaXNBbmdsZUJyYWNrZXQgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IFNUUklDVF9SRVNPTFVUSU9OID0gbmV3IFN0cmljdFJlc29sdXRpb24oKTtcblxuLyoqXG4gKiBBIGBMb29zZU1vZGVSZXNvbHV0aW9uYCBpbmNsdWRlczpcbiAqXG4gKiAtIDAgb3IgbW9yZSBuYW1lc3BhY2VzIHRvIHJlc29sdmUgdGhlIHZhcmlhYmxlIGluXG4gKiAtIG9wdGlvbmFsIGZhbGxiYWNrIGJlaGF2aW9yXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoZXJlIGFyZSBhIGxpbWl0ZWQgbnVtYmVyIG9mIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBkZWdyZWVzIG9mIGZyZWVkb20sXG4gKiBhbmQgdGhleSBhcmUgY2FwdHVyZWQgYnkgdGhlIGBBbWJpZ3VpdHlgIHVuaW9uIGJlbG93LlxuICovXG5leHBvcnQgY2xhc3MgTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gIC8qKlxuICAgKiBOYW1lc3BhY2VkIHJlc29sdXRpb24gaXMgdXNlZCBpbiBhbiB1bmFtYmlndW91cyBzeW50YXggcG9zaXRpb246XG4gICAqXG4gICAqIDEuIGAoc2V4cClgIChuYW1lc3BhY2U6IGBIZWxwZXJgKVxuICAgKiAyLiBge3sjYmxvY2t9fWAgKG5hbWVzcGFjZTogYENvbXBvbmVudGApXG4gICAqIDMuIGA8YSB7e21vZGlmaWVyfX0+YCAobmFtZXNwYWNlOiBgTW9kaWZpZXJgKVxuICAgKiA0LiBgPENvbXBvbmVudCAvPmAgKG5hbWVzcGFjZTogYENvbXBvbmVudGApXG4gICAqXG4gICAqIEBzZWUge05hbWVzcGFjZWRBbWJpZ3VpdHl9XG4gICAqL1xuICBzdGF0aWMgbmFtZXNwYWNlZChuYW1lc3BhY2U6IEZyZWVWYXJOYW1lc3BhY2UsIGlzQW5nbGVCcmFja2V0ID0gZmFsc2UpOiBMb29zZU1vZGVSZXNvbHV0aW9uIHtcbiAgICByZXR1cm4gbmV3IExvb3NlTW9kZVJlc29sdXRpb24oXG4gICAgICB7XG4gICAgICAgIG5hbWVzcGFjZXM6IFtuYW1lc3BhY2VdLFxuICAgICAgICBmYWxsYmFjazogZmFsc2UsXG4gICAgICB9LFxuICAgICAgaXNBbmdsZUJyYWNrZXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbGxiYWNrIHJlc29sdXRpb24gaXMgdXNlZCB3aGVuIG5vIG5hbWVzcGFjZWQgcmVzb2x1dGlvbnMgYXJlIHBvc3NpYmxlLCBidXQgZmFsbGJhY2tcbiAgICogcmVzb2x1dGlvbiBpcyBzdGlsbCBhbGxvd2VkLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICoge3t4Lnl9fVxuICAgKiBgYGBcbiAgICpcbiAgICogQHNlZSB7RmFsbGJhY2tBbWJpZ3VpdHl9XG4gICAqL1xuICBzdGF0aWMgZmFsbGJhY2soKTogTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMb29zZU1vZGVSZXNvbHV0aW9uKHsgbmFtZXNwYWNlczogW10sIGZhbGxiYWNrOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCByZXNvbHV0aW9uIGlzIHVzZWQgd2hlbiB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIHJlc29sdmVkIGluIGJvdGggdGhlIGBjb21wb25lbnRgIGFuZFxuICAgKiBgaGVscGVyYCBuYW1lc3BhY2VzLiBGYWxsYmFjayByZXNvbHV0aW9uIGlzIG9wdGlvbmFsLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICoge3t4fX1cbiAgICogYGBgXG4gICAqXG4gICAqIF4gYHhgIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMgd2l0aCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBgYGBoYnNcbiAgICoge3t4IHl9fVxuICAgKiBgYGBcbiAgICpcbiAgICogXiBgeGAgc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcyB3aXRob3V0IGZhbGxiYWNrXG4gICAqIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEBzZWUge0NvbXBvbmVudE9ySGVscGVyQW1iaWd1aXR5fVxuICAgKi9cbiAgc3RhdGljIGFwcGVuZCh7IGludm9rZSB9OiB7IGludm9rZTogYm9vbGVhbiB9KTogTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMb29zZU1vZGVSZXNvbHV0aW9uKHtcbiAgICAgIG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkNvbXBvbmVudCwgRnJlZVZhck5hbWVzcGFjZS5IZWxwZXJdLFxuICAgICAgZmFsbGJhY2s6ICFpbnZva2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1c3RpbmcgYXBwZW5kIHJlc29sdXRpb24gaXMgdXNlZCB3aGVuIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gYm90aCB0aGUgYGNvbXBvbmVudGAgYW5kXG4gICAqIGBoZWxwZXJgIG5hbWVzcGFjZXMuIEZhbGxiYWNrIHJlc29sdXRpb24gaXMgb3B0aW9uYWwuXG4gICAqXG4gICAqIGBgYGhic1xuICAgKiB7e3t4fX19XG4gICAqIGBgYFxuICAgKlxuICAgKiBeIGB4YCBzaG91bGQgYmUgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzIHdpdGggZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIHt7e3ggeX19fVxuICAgKiBgYGBcbiAgICpcbiAgICogXiBgeGAgc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBhbmQgYGhlbHBlcmAgbmFtZXNwYWNlcyB3aXRob3V0IGZhbGxiYWNrXG4gICAqIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEBzZWUge0hlbHBlckFtYmlndWl0eX1cbiAgICovXG4gIHN0YXRpYyB0cnVzdGluZ0FwcGVuZCh7IGludm9rZSB9OiB7IGludm9rZTogYm9vbGVhbiB9KTogTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMb29zZU1vZGVSZXNvbHV0aW9uKHtcbiAgICAgIG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcl0sXG4gICAgICBmYWxsYmFjazogIWludm9rZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGUgcmVzb2x1dGlvbiBpcyB1c2VkIHdoZW4gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSByZXNvbHZlZCBhcyBhIGBoZWxwZXJgIHdpdGggZmFsbGJhY2tcbiAgICogcmVzb2x1dGlvbi5cbiAgICpcbiAgICogYGBgaGJzXG4gICAqIDxhIGhyZWY9e3t4fX0gLz5cbiAgICogPGEgaHJlZj1cInt7eH19Lmh0bWxcIiAvPlxuICAgKiBgYGBcbiAgICpcbiAgICogXiByZXNvbHZlZCBpbiB0aGUgYGhlbHBlcmAgbmFtZXNwYWNlIHdpdGggZmFsbGJhY2tcbiAgICpcbiAgICogQHNlZSB7SGVscGVyQW1iaWd1aXR5fVxuICAgKi9cbiAgc3RhdGljIGF0dHIoKTogTG9vc2VNb2RlUmVzb2x1dGlvbiB7XG4gICAgcmV0dXJuIG5ldyBMb29zZU1vZGVSZXNvbHV0aW9uKHsgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuSGVscGVyXSwgZmFsbGJhY2s6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBhbWJpZ3VpdHk6IEFtYmlndWl0eSwgcmVhZG9ubHkgaXNBbmdsZUJyYWNrZXQgPSBmYWxzZSkge31cblxuICByZXNvbHV0aW9uKCk6IEdldENvbnRleHR1YWxGcmVlT3Age1xuICAgIGlmICh0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldFN0cmljdEZyZWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKHRoaXMuYW1iaWd1aXR5LmZhbGxiYWNrKSB7XG4gICAgICAgIC8vIHNpbXBsZSBuYW1lc3BhY2VkIHJlc29sdXRpb24gd2l0aCBmYWxsYmFjayBtdXN0IGJlIGF0dHI9e3t4fX1cbiAgICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc0hlbHBlckhlYWRPclRoaXNGYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNpbXBsZSBuYW1lc3BhY2VkIHJlc29sdXRpb24gd2l0aG91dCBmYWxsYmFja1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXNbMF0pIHtcbiAgICAgICAgICBjYXNlIEZyZWVWYXJOYW1lc3BhY2UuSGVscGVyOlxuICAgICAgICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc0hlbHBlckhlYWQ7XG4gICAgICAgICAgY2FzZSBGcmVlVmFyTmFtZXNwYWNlLk1vZGlmaWVyOlxuICAgICAgICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc01vZGlmaWVySGVhZDtcbiAgICAgICAgICBjYXNlIEZyZWVWYXJOYW1lc3BhY2UuQ29tcG9uZW50OlxuICAgICAgICAgICAgcmV0dXJuIFNleHBPcGNvZGVzLkdldEZyZWVBc0NvbXBvbmVudEhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYW1iaWd1aXR5LmZhbGxiYWNrKSB7XG4gICAgICAvLyBjb21wb25lbnQgb3IgaGVscGVyICsgZmFsbGJhY2sgKHt7c29tZXRoaW5nfX0pXG4gICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzQ29tcG9uZW50T3JIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBvbmVudCBvciBoZWxwZXIgd2l0aG91dCBmYWxsYmFjayAoe3tzb21ldGhpbmcgc29tZXRoaW5nfX0pXG4gICAgICByZXR1cm4gU2V4cE9wY29kZXMuR2V0RnJlZUFzQ29tcG9uZW50T3JIZWxwZXJIZWFkO1xuICAgIH1cbiAgfVxuXG4gIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkUmVzb2x1dGlvbiB7XG4gICAgaWYgKHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0xvb3NlJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuYW1iaWd1aXR5Lm5hbWVzcGFjZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodGhpcy5hbWJpZ3VpdHkuZmFsbGJhY2spIHtcbiAgICAgICAgLy8gc2ltcGxlIG5hbWVzcGFjZWQgcmVzb2x1dGlvbiB3aXRoIGZhbGxiYWNrIG11c3QgYmUgYXR0cj17e3h9fVxuICAgICAgICByZXR1cm4gWydhbWJpZ3VvdXMnLCBTZXJpYWxpemVkQW1iaWd1aXR5LkF0dHJdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsnbnMnLCB0aGlzLmFtYmlndWl0eS5uYW1lc3BhY2VzWzBdXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYW1iaWd1aXR5LmZhbGxiYWNrKSB7XG4gICAgICAvLyBjb21wb25lbnQgb3IgaGVscGVyICsgZmFsbGJhY2sgKHt7c29tZXRoaW5nfX0pXG4gICAgICByZXR1cm4gWydhbWJpZ3VvdXMnLCBTZXJpYWxpemVkQW1iaWd1aXR5LkFwcGVuZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBvbmVudCBvciBoZWxwZXIgd2l0aG91dCBmYWxsYmFjayAoe3tzb21ldGhpbmcgc29tZXRoaW5nfX0pXG4gICAgICByZXR1cm4gWydhbWJpZ3VvdXMnLCBTZXJpYWxpemVkQW1iaWd1aXR5Lkludm9rZV07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBUkdVTUVOVF9SRVNPTFVUSU9OID0gTG9vc2VNb2RlUmVzb2x1dGlvbi5mYWxsYmFjaygpO1xuXG5leHBvcnQgY29uc3QgZW51bSBGcmVlVmFyTmFtZXNwYWNlIHtcbiAgSGVscGVyID0gJ0hlbHBlcicsXG4gIE1vZGlmaWVyID0gJ01vZGlmaWVyJyxcbiAgQ29tcG9uZW50ID0gJ0NvbXBvbmVudCcsXG59XG5cbi8qKlxuICogQSBgQ29tcG9uZW50T3JIZWxwZXJBbWJpZ3VpdHlgIG1pZ2h0IGJlIGEgY29tcG9uZW50IG9yIGEgaGVscGVyLCB3aXRoIGFuIG9wdGlvbmFsIGZhbGxiYWNrXG4gKlxuICogYGBgaGJzXG4gKiB7e3h9fVxuICogYGBgXG4gKlxuICogXiBgeGAgaXMgcmVzb2x2ZWQgaW4gdGhlIGBjb21wb25lbnRgIGFuZCBgaGVscGVyYCBuYW1lc3BhY2VzLCB3aXRoIGZhbGxiYWNrXG4gKlxuICogYGBgaGJzXG4gKiB7e3ggeX19XG4gKiBgYGBcbiAqXG4gKiBeIGB4YCBpcyByZXNvbHZlZCBpbiB0aGUgYGNvbXBvbmVudGAgYW5kIGBoZWxwZXJgIG5hbWVzcGFjZXMsIHdpdGhvdXQgZmFsbGJhY2tcbiAqL1xudHlwZSBDb21wb25lbnRPckhlbHBlckFtYmlndWl0eSA9IHtcbiAgbmFtZXNwYWNlczogW0ZyZWVWYXJOYW1lc3BhY2UuQ29tcG9uZW50LCBGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcl07XG4gIGZhbGxiYWNrOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBBIGBIZWxwZXJBbWJpZ3VpdHlgIG11c3QgYmUgYSBoZWxwZXIsIGJ1dCBpdCBoYXMgZmFsbGJhY2suIElmIGl0IGRpZG4ndCBoYXZlIGZhbGxiYWNrLCBpdCB3b3VsZFxuICogYmUgYSBgTmFtZXNwYWNlZEFtYmlndWl0eWAuXG4gKlxuICogYGBgaGJzXG4gKiA8YSBocmVmPXt7eH19IC8+XG4gKiA8YSBocmVmPVwie3t4fX0uaHRtbFwiIC8+XG4gKiBgYGBcbiAqXG4gKiBeIGB4YCBpcyByZXNvbHZlZCBpbiB0aGUgYGhlbHBlcmAgbmFtZXNwYWNlIHdpdGggZmFsbGJhY2tcbiAqL1xudHlwZSBIZWxwZXJBbWJpZ3VpdHkgPSB7IG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkhlbHBlcl07IGZhbGxiYWNrOiBib29sZWFuIH07XG5cbi8qKlxuICogQSBgTmFtZXNwYWNlZEFtYmlndWl0eWAgbXVzdCBiZSByZXNvbHZlZCBpbiBhIHBhcnRpY3VsYXIgbmFtZXNwYWNlLCB3aXRob3V0IGZhbGxiYWNrLlxuICpcbiAqIGBgYGhic1xuICogPFggLz5cbiAqIGBgYFxuICpcbiAqIF4gYFhgIGlzIHJlc29sdmVkIGluIHRoZSBgY29tcG9uZW50YCBuYW1lc3BhY2Ugd2l0aG91dCBmYWxsYmFja1xuICpcbiAqIGBgYGhic1xuICogKHgpXG4gKiBgYGBcbiAqXG4gKiBeIGB4YCBpcyByZXNvbHZlZCBpbiB0aGUgYGhlbHBlcmAgbmFtZXNwYWNlIHdpdGhvdXQgZmFsbGJhY2tcbiAqXG4gKiBgYGBoYnNcbiAqIDxhIHt7eH19IC8+XG4gKiBgYGBcbiAqXG4gKiBeIGB4YCBpcyByZXNvbHZlZCBpbiB0aGUgYG1vZGlmaWVyYCBuYW1lc3BhY2Ugd2l0aG91dCBmYWxsYmFja1xuICovXG50eXBlIE5hbWVzcGFjZWRBbWJpZ3VpdHkgPSB7XG4gIG5hbWVzcGFjZXM6IFtGcmVlVmFyTmFtZXNwYWNlLkNvbXBvbmVudCB8IEZyZWVWYXJOYW1lc3BhY2UuSGVscGVyIHwgRnJlZVZhck5hbWVzcGFjZS5Nb2RpZmllcl07XG4gIGZhbGxiYWNrOiBmYWxzZTtcbn07XG5cbnR5cGUgRmFsbGJhY2tBbWJpZ3VpdHkgPSB7XG4gIG5hbWVzcGFjZXM6IFtdO1xuICBmYWxsYmFjazogdHJ1ZTtcbn07XG5cbnR5cGUgQW1iaWd1aXR5ID1cbiAgfCBDb21wb25lbnRPckhlbHBlckFtYmlndWl0eVxuICB8IEhlbHBlckFtYmlndWl0eVxuICB8IE5hbWVzcGFjZWRBbWJpZ3VpdHlcbiAgfCBGYWxsYmFja0FtYmlndWl0eTtcblxuZXhwb3J0IHR5cGUgRnJlZVZhclJlc29sdXRpb24gPSBTdHJpY3RSZXNvbHV0aW9uIHwgTG9vc2VNb2RlUmVzb2x1dGlvbjtcblxuLy8gU2VyaWFsaXphdGlvblxuXG5jb25zdCBlbnVtIFNlcmlhbGl6ZWRBbWJpZ3VpdHkge1xuICAvLyB7e3h9fVxuICBBcHBlbmQgPSAnQXBwZW5kJyxcbiAgLy8gaHJlZj17e3h9fVxuICBBdHRyID0gJ0F0dHInLFxuICAvLyB7e3ggeX19IChub3QgYXR0cilcbiAgSW52b2tlID0gJ0ludm9rZScsXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRSZXNvbHV0aW9uID1cbiAgfCAnU3RyaWN0J1xuICB8ICdMb29zZSdcbiAgfCBbJ25zJywgRnJlZVZhck5hbWVzcGFjZV1cbiAgfCBbJ2FtYmlndW91cycsIFNlcmlhbGl6ZWRBbWJpZ3VpdHldO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJlc29sdXRpb24ocmVzb2x1dGlvbjogU2VyaWFsaXplZFJlc29sdXRpb24pOiBGcmVlVmFyUmVzb2x1dGlvbiB7XG4gIGlmICh0eXBlb2YgcmVzb2x1dGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBzd2l0Y2ggKHJlc29sdXRpb24pIHtcbiAgICAgIGNhc2UgJ0xvb3NlJzpcbiAgICAgICAgcmV0dXJuIExvb3NlTW9kZVJlc29sdXRpb24uZmFsbGJhY2soKTtcbiAgICAgIGNhc2UgJ1N0cmljdCc6XG4gICAgICAgIHJldHVybiBTVFJJQ1RfUkVTT0xVVElPTjtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHJlc29sdXRpb25bMF0pIHtcbiAgICBjYXNlICdhbWJpZ3VvdXMnOlxuICAgICAgc3dpdGNoIChyZXNvbHV0aW9uWzFdKSB7XG4gICAgICAgIGNhc2UgU2VyaWFsaXplZEFtYmlndWl0eS5BcHBlbmQ6XG4gICAgICAgICAgcmV0dXJuIExvb3NlTW9kZVJlc29sdXRpb24uYXBwZW5kKHsgaW52b2tlOiBmYWxzZSB9KTtcbiAgICAgICAgY2FzZSBTZXJpYWxpemVkQW1iaWd1aXR5LkF0dHI6XG4gICAgICAgICAgcmV0dXJuIExvb3NlTW9kZVJlc29sdXRpb24uYXR0cigpO1xuICAgICAgICBjYXNlIFNlcmlhbGl6ZWRBbWJpZ3VpdHkuSW52b2tlOlxuICAgICAgICAgIHJldHVybiBMb29zZU1vZGVSZXNvbHV0aW9uLmFwcGVuZCh7IGludm9rZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ25zJzpcbiAgICAgIHJldHVybiBMb29zZU1vZGVSZXNvbHV0aW9uLm5hbWVzcGFjZWQocmVzb2x1dGlvblsxXSk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=