obsidian-dev-utils 92.0.0 → 92.1.0
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 +4 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +5 -0
- package/dist/lib/cjs/obsidian/vault.cjs +1 -1
- package/dist/lib/cjs/obsidian/vault.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +12 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +5 -0
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/obsidian/vault.d.mts +3 -0
- package/dist/lib/esm/obsidian/vault.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +12 -0
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +1 -1
- package/package.json +1 -1
|
@@ -753,4 +753,4 @@ function toDisplayPath(params) {
|
|
|
753
753
|
findOverExposure,
|
|
754
754
|
formatOverExposureFindings
|
|
755
755
|
});
|
|
756
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyB0aWdodGVuZWQgaW4gcGxhY2UgdmlhIHtAbGluayB3cml0ZUZpbGV9ICh3aGljaCBtdXN0IHRoZW5cbiAgICogYmUgcHJvdmlkZWQpLCBhbmQgdGhlIHJldHVybmVkIGZpbmRpbmdzIGNhcnJ5IHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gT25seSBkZWNsYXJhdGlvbnMgaW4gbm9uLXRlc3QgZmlsZXNcbiAgICogdW5kZXIgdGhpcyBmb2xkZXIgYXJlIGFuYWx5emVkOyBkZWNsYXJhdGlvbnMgZWxzZXdoZXJlICh0ZXN0IGZpbGVzLCBkZXBlbmRlbmNpZXMpIGFyZSBpZ25vcmVkXG4gICAqIGJ1dCBzdGlsbCBjb3VudGVkIGFzIHJlZmVyZW5jZSBzaXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHNob3VsZEZpeH1cbiAgICogaXMgYHRydWVgOyBpZ25vcmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHdyaXRlIChvcmlnaW5hbCBjYXNpbmcsIGFzIHN0b3JlZCBpbiB0aGUgcHJvZ3JhbSkuXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGZ1bGwgbmV3IGZpbGUgY29udGVudHMuXG4gICAqL1xuICB3cml0ZUZpbGU/KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgY29tcGlsZXIgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKlxuICBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gIFRoZSBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgdG8gcmVhZCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogT3ZlckV4cG9zdXJlRmlsZVN5c3RlbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZml4YWJsZSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIGluIHBsYWNlIG9uIGRpc2sgKHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIGRyb3BwZWQsXG4gICAqIG9yIGEgYHByaXZhdGVgIC8gYHByb3RlY3RlZGAgbW9kaWZpZXIgaXMgaW5zZXJ0ZWQvcmVwbGFjZWQpLiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlXG4gICAqIHByb2plY3QgaXMgb25seSBhbmFseXplZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICovXG4gIGRpcmVjdG9yeUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3RvcnkodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3Rvcmllcyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBSb290IGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIGV4dGVuc2lvbnMgLSBFeHRlbnNpb25zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBleGNsdWRlIC0gUGF0dGVybnMgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIGluY2x1ZGUgLSBQYXR0ZXJucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZGVwdGggLSBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gICAqL1xuICByZWFkRGlyZWN0b3J5KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIC8qKlxuICAxLWJhc2VkIGNvbHVtbiBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEV4cG9zdXJlOiBDdXJyZW50RXhwb3N1cmU7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgZGVjbGFyaW5nIHRoZSBzeW1ib2wuXG4gICAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIChiZXNpZGVzIGl0c2VsZikuXG4gICAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKlxuICBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuXG4gICAqL1xuICByZWFkb25seSBpc01lbWJlcjogYm9vbGVhbjtcblxuICAvKipcbiAgMS1iYXNlZCBsaW5lIG9mIHRoZSBkZWNsYXJhdGlvbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBkZWNsYXJlZCBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKlxuICBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZTtcblxuICAvKipcbiAgYHRydWVgIHdoZW4gYSBmaXggcnVuIHRpZ2h0ZW5lZCB0aGlzIGRlY2xhcmF0aW9uIGluIHBsYWNlLiBBbHdheXMgYGZhbHNlYCBpbiBhIHJlcG9ydCBydW4uXG4gICAqL1xuICByZWFkb25seSB3YXNGaXhlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqXG4gIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuXG4gICAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRGaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUb3RhbCBudW1iZXIgb2Ygc291cmNlIGZpbGVzIHRoYXQgd2lsbCBiZSBhbmFseXplZC5cbiAgICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2h5IGEgZml4IHJ1biBsZWZ0IGEgZmluZGluZyB1bnRvdWNoZWQ6XG4gKlxuICogLSBgZGVjb3JhdGVkYCBcdTIwMTQgdGhlIG1lbWJlciBjYXJyaWVzIGEgZGVjb3JhdG9yLCBzbyB0aGUgbW9kaWZpZXIgaW5zZXJ0aW9uIHBvaW50IGlzIGFtYmlndW91cy5cbiAqIC0gYHNoYXJlZC1leHBvcnRgIFx1MjAxNCB0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgZGVjbGFyYXRvci5cbiAqIC0gYHRlc3Qtb25seWAgXHUyMDE0IHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdHMsIHNvIHRpZ2h0ZW5pbmcgd291bGQgYnJlYWsgdGhlIHRlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJFeHBvc3VyZVNraXBSZWFzb24gPSAnZGVjb3JhdGVkJyB8ICdzaGFyZWQtZXhwb3J0JyB8ICd0ZXN0LW9ubHknO1xuXG4vKipcbiAqIFRoZSAodGlnaHRlcikgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRFeHBvc3VyZSA9ICdmaWxlLWxvY2FsJyB8ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBhbmQgZnJhbWV3b3JrIG1lbWJlcnMgaW52b2tlZCBieSBPYnNpZGlhbiBvciBhIGJhc2UgY2xhc3MgdmlhIHJlZ2lzdHJhdGlvbiByYXRoZXIgdGhhblxuICogYnkgcmVmZXJlbmNlcyB0aGUgbGFuZ3VhZ2Ugc2VydmljZSBjYW4gc2VlLiBUaWdodGVuaW5nIHRoZXNlIHdvdWxkIGJyZWFrIHRoZSBmcmFtZXdvcmsgY29udHJhY3QsXG4gKiBzbyB0aGV5IGFyZSBuZXZlciByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJRkVDWUNMRV9BTExPV0xJU1Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnZGlzcGxheScsXG4gICdoaWRlJyxcbiAgJ29uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsXG4gICdvbkxheW91dFJlYWR5JyxcbiAgJ29ubG9hZCcsXG4gICdvbmxvYWRJbXBsJyxcbiAgJ29uTG9hZFNldHRpbmdzJyxcbiAgJ29uU2F2ZVNldHRpbmdzJyxcbiAgJ29udW5sb2FkJyxcbiAgJ29udW5sb2FkSW1wbCdcbl0pO1xuXG5pbnRlcmZhY2UgQW5hbHlzaXNDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG4gIHJlYWRvbmx5IGVkaXRzOiAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPjtcbn1cblxuaW50ZXJmYWNlIEFuYWx5c2lzUmVzdWx0IHtcbiAgcmVhZG9ubHkgZWRpdHM6IHJlYWRvbmx5IChudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpW107XG4gIHJlYWRvbmx5IGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXN9LlxuICovXG5pbnRlcmZhY2UgQXBwbHlPdmVyRXhwb3N1cmVGaXhlc1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgcHJvZ3JhbSB3aG9zZSBzb3VyY2UgZmlsZXMgc3VwcGx5IHRoZSBvcmlnaW5hbCB0ZXh0IHRoZSBlZGl0cyBhcmUgYXBwbGllZCB0bzsgYHVuZGVmaW5lZGAgd2hlbiBubyBwcm9ncmFtIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBhbmFseXNpcyByZXN1bHQgd2hvc2UgZmluZGluZ3MgYW5kIGVkaXRzIGFyZSB0dXJuZWQgaW50byBpbi1wbGFjZSBmaXhlcy5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogQW5hbHlzaXNSZXN1bHQ7XG5cbiAgLyoqXG4gIFdoZW4gYHRydWVgLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieSB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28gaW5zdGVhZCBvZiBiZWluZyBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gIFdyaXRlcyB0aGUgdGlnaHRlbmVkIGNvbnRlbnRzIG9mIGEgY2hhbmdlZCBmaWxlIGJhY2sgdG8gZGlzay5cbiAgICovXG4gIHdyaXRlRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkRmluZGluZ30uXG4gKi9cbmludGVyZmFjZSBCdWlsZEZpbmRpbmdQYXJhbXMge1xuICAvKipcbiAgVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwgb2YgdGhlIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEV4cG9zdXJlOiBDdXJyZW50RXhwb3N1cmU7XG5cbiAgLyoqXG4gIEZsYWdzIGRlc2NyaWJpbmcgd2hldGhlciB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIG9yIGlzIGZvcmNlZCB3aWRlIGJ5IHRlc3Qtb25seSByZWZlcmVuY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxhZ3M6IEZpbmRpbmdGbGFncztcblxuICAvKipcbiAgVGhlIGRlY2xhcmF0aW9uJ3MgbmFtZSBub2RlLCB1c2VkIHRvIHJlc29sdmUgaXRzIHBvc2l0aW9uIGFuZCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZU5vZGU6IE5vZGU7XG5cbiAgLyoqXG4gIFRoZSBkZWNsYXJhdGlvbiBub2RlLCB1c2VkIHRvIHJlc29sdmUgaXRzIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZTogTm9kZTtcblxuICAvKipcbiAgVGhlIHRpZ2h0ZXIgZXhwb3N1cmUgbGV2ZWwgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHJlZHVjZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG59XG5cbnR5cGUgQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA9IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXN9LlxuICovXG5pbnRlcmZhY2UgQ29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBhbmFseXNpcyBjb250ZXh0IHByb3ZpZGluZyB0aGUgc3RyaW5nLWxpdGVyYWwgaW5kZXggYW5kIHR5cGUgY2hlY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKipcbiAgVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5hbWUgdGhlIHN0cmluZyBsaXRlcmFscyBtaWdodCByZWZlcmVuY2UuXG4gICAqL1xuICByZWFkb25seSBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gIFRoZSBtZW1iZXIncyBuYW1lIG5vZGUsIHdob3NlIHRleHQgaXMgbWF0Y2hlZCBhZ2FpbnN0IHN0cmluZy1saXRlcmFsIG9jY3VycmVuY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZU5vZGU6IE5vZGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbXB1dGVOZWVkZWRFeHBvc3VyZX0uXG4gKi9cbmludGVyZmFjZSBDb21wdXRlTmVlZGVkRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGFuYWx5c2lzIGNvbnRleHQgcHJvdmlkaW5nIHRoZSBwcm9ncmFtIGFuZCB0eXBlIGNoZWNrZXIuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQ7XG5cbiAgLyoqXG4gIFRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1lbWJlciB3aG9zZSBuZWVkZWQgZXhwb3N1cmUgaXMgY29tcHV0ZWQuXG4gICAqL1xuICByZWFkb25seSBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gIFRoZSByZWZlcmVuY2UgbG9jYXRpb25zIHRoYXQgbXVzdCByZW1haW4gcmVhY2hhYmxlIGF0IHRoZSBjb21wdXRlZCBleHBvc3VyZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZXM6IHJlYWRvbmx5IFJlZmVyZW5jZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGRldGVybWluZVNraXBSZWFzb259LlxuICovXG5pbnRlcmZhY2UgRGV0ZXJtaW5lU2tpcFJlYXNvblBhcmFtcyB7XG4gIC8qKlxuICBUaGUgdGV4dCBlZGl0IHRoYXQgd291bGQgdGlnaHRlbiB0aGUgZmluZGluZywgb3IgYG51bGxgIHdoZW4gbm8gc2FmZSBlZGl0IGV4aXN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKipcbiAgVGhlIGZpbmRpbmcgdW5kZXIgY29uc2lkZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmc7XG5cbiAgLyoqXG4gIFdoZW4gYHRydWVgLCB0ZXN0LW9ubHkgZmluZGluZ3MgYXJlIHRpZ2h0ZW5lZCByYXRoZXIgdGhhbiBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG59XG5cbnR5cGUgRXhwb3J0YWJsZURlY2xhcmF0aW9uID0gQ2xhc3NEZWNsYXJhdGlvbiB8IEVudW1EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IFR5cGVBbGlhc0RlY2xhcmF0aW9uIHwgVmFyaWFibGVTdGF0ZW1lbnQ7XG5cbmludGVyZmFjZSBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlIHtcbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbiAgcmVhZG9ubHkgaXNQbGFpbkZpbGVMb2NhbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZpbmRpbmdGbGFncyB7XG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRDbGFzc0F0UG9zaXRpb259LlxuICovXG5pbnRlcmZhY2UgR2V0Q2xhc3NBdFBvc2l0aW9uUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcG9zaXRpb24uXG4gICAqL1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAwLWJhc2VkIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIHJlZmVyZW5jZSB3aXRoaW4gdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwb3NpdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgcHJvZ3JhbSB1c2VkIHRvIHJlc29sdmUgdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNEZXJpdmVkRnJvbX0uXG4gKi9cbmludGVyZmFjZSBJc0Rlcml2ZWRGcm9tUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjYW5kaWRhdGUgYmFzZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xuXG4gIC8qKlxuICBUaGUgdHlwZSBjaGVja2VyIHVzZWQgdG8gcmVzb2x2ZSBoZXJpdGFnZSBzeW1ib2xzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG5cbiAgLyoqXG4gIFRoZSBjYW5kaWRhdGUgZGVyaXZlZCBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0tleVJlZmVyZW5jZVRvQ2xhc3N9LlxuICovXG5pbnRlcmZhY2UgSXNLZXlSZWZlcmVuY2VUb0NsYXNzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIHRoZSBsaXRlcmFsJ3MgY29udGV4dHVhbCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG5cbiAgLyoqXG4gIFRoZSBzZXQgb2YgcHJvcGVydHkga2V5cyBkZWNsYXJlZCBieSB0aGUgY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBrZXlTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz47XG5cbiAgLyoqXG4gIFRoZSBzdHJpbmctbGl0ZXJhbCBub2RlIGJlaW5nIHRlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc093blNvdXJjZUZpbGV9LlxuICovXG5pbnRlcmZhY2UgSXNPd25Tb3VyY2VGaWxlUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIGZpbGUgdW5kZXIgdGVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcbn1cblxudHlwZSBNZW1iZXJFeHBvc3VyZSA9ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogQSBzaW5nbGUgaW4tcGxhY2UgdGV4dCByZXBsYWNlbWVudCB0aGF0IHRpZ2h0ZW5zIGEgZGVjbGFyYXRpb24ncyBleHBvc3VyZS4gQSB6ZXJvLWxlbmd0aCBlZGl0IGlzXG4gKiBhbiBpbnNlcnRpb24gKGUuZy4gYWRkaW5nIGFuIGV4cGxpY2l0IGBwcml2YXRlYCBtb2RpZmllciB0byBhbiBpbXBsaWNpdGx5LWBwdWJsaWNgIG1lbWJlcikuXG4gKi9cbmludGVyZmFjZSBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxlbmd0aDogbnVtYmVyO1xuICByZWFkb25seSBuZXdUZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlY29yZH0uXG4gKi9cbmludGVyZmFjZSBSZWNvcmRQYXJhbXMge1xuICAvKipcbiAgVGhlIGFuYWx5c2lzIGNvbnRleHQgd2hvc2UgZmluZGluZ3MgYW5kIGVkaXRzIGFyZSBhcHBlbmRlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKipcbiAgVGhlIHRleHQgZWRpdCB0aGF0IHdvdWxkIHRpZ2h0ZW4gdGhlIGZpbmRpbmcsIG9yIGBudWxsYCB3aGVuIG5vIHNhZmUgZWRpdCBleGlzdHMuXG4gICAqL1xuICByZWFkb25seSBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQ7XG5cbiAgLyoqXG4gIFRoZSBmaW5kaW5nIHRvIHJlY29yZC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmc7XG59XG5cbmludGVyZmFjZSBSZWZlcmVuY2VMb2NhdGlvbiB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTb3VyY2VGaWxlVGV4dCB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlIHtcbiAgcmVhZG9ubHkgbm9kZTogU3RyaW5nTGl0ZXJhbExpa2U7XG4gIHJlYWRvbmx5IHNvdXJjZUZpbGU6IFNvdXJjZUZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRvRGlzcGxheVBhdGh9LlxuICovXG5pbnRlcmZhY2UgVG9EaXNwbGF5UGF0aFBhcmFtcyB7XG4gIC8qKlxuICBXaGVuIHNldCwgdGhlIHBhdGggaXMgcmVuZGVyZWQgcmVsYXRpdmUgdG8gdGhpcyBmb2xkZXI7IHBhdGhzIG91dHNpZGUgaXQgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoe1xuICAgIHByb2dyYW06IHBhcmFtcy5sYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpLFxuICAgIHJlc3VsdCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHdyaXRlRmlsZVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB7QGxpbmsgTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0gYmFja2VkIGJ5IGFuIGV4cGxpY2l0IGZpbGUgbGlzdCBhbmQgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgbGFuZ3VhZ2Utc2VydmljZSBob3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdChwYXJhbXM6IENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2VIb3N0IHtcbiAgY29uc3QgeyBjb21waWxlck9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeUV4aXN0czogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5kaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5KSxcbiAgICBmaWxlRXhpc3RzOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5maWxlRXhpc3RzKGZpbGUpLFxuICAgIGdldENvbXBpbGF0aW9uU2V0dGluZ3M6ICgpID0+IGNvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiBmaWxlU3lzdGVtLmdldEN1cnJlbnREaXJlY3RvcnkoKSxcbiAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6IChsaWJPcHRpb25zKSA9PiBnZXREZWZhdWx0TGliRmlsZVBhdGgobGliT3B0aW9ucyksXG4gICAgZ2V0RGlyZWN0b3JpZXM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZ2V0RGlyZWN0b3JpZXMoZGlyZWN0b3J5KSxcbiAgICBnZXRTY3JpcHRGaWxlTmFtZXM6ICgpID0+IFsuLi5maWxlTmFtZXNdLFxuICAgIGdldFNjcmlwdFNuYXBzaG90OiAoZmlsZU5hbWUpOiBJU2NyaXB0U25hcHNob3QgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRleHQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFNjcmlwdFNuYXBzaG90LmZyb21TdHJpbmcodGV4dCk7XG4gICAgfSxcbiAgICBnZXRTY3JpcHRWZXJzaW9uOiAoKSA9PiAnMCcsXG4gICAgcmVhZERpcmVjdG9yeTogKHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSA9PiBmaWxlU3lzdGVtLnJlYWREaXJlY3RvcnkocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpLFxuICAgIHJlYWRGaWxlOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxhbmd1YWdlIHNlcnZpY2Ugb3ZlciBldmVyeSBmaWxlIGluIGEgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEgbGFuZ3VhZ2Ugc2VydmljZSByZWFkeSBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZShwYXJhbXM6IENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2Uge1xuICBjb25zdCB7IGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhwYXJhbXMudHNDb25maWdQYXRoKTtcbiAgcmV0dXJuIGNyZWF0ZUxhbmd1YWdlU2VydmljZShjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHsgY29tcGlsZXJPcHRpb25zOiBvcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW06IHN5cyB9KSwgY3JlYXRlRG9jdW1lbnRSZWdpc3RyeSgpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGluIGEgcHJvamVjdCBvbiBkaXNrLiBXaGVuXG4gKiB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgYWxzbyB0aWdodGVuZWQgaW4gcGxhY2VcbiAqIChyZXdyaXRpbmcgdGhlIGFmZmVjdGVkIHNvdXJjZSBmaWxlcyB2aWEgYHR5cGVzY3JpcHRgJ3MgYHN5cy53cml0ZUZpbGVgKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE92ZXJFeHBvc3VyZShwYXJhbXM6IEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBwcm9qZWN0Rm9sZGVyID0gdG9DYW5vbmljYWwocGFyYW1zLnByb2plY3RGb2xkZXIpO1xuICBjb25zdCBsYW5ndWFnZVNlcnZpY2UgPSBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHsgdHNDb25maWdQYXRoOiBgJHtwcm9qZWN0Rm9sZGVyfS90c2NvbmZpZy5qc29uYCB9KTtcbiAgcmV0dXJuIGFuYWx5emVPdmVyRXhwb3N1cmUoe1xuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBzaG91bGRGaXg6IHBhcmFtcy5zaG91bGRGaXgsXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSxcbiAgICBzcmNGb2xkZXI6IGAke3Byb2plY3RGb2xkZXJ9L3NyY2AsXG4gICAgd3JpdGVGaWxlOiAocGF0aCwgY29udGVudCkgPT4ge1xuICAgICAgc3lzLndyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbiAgICB9LFxuICAgIC4uLnBhcmFtcy5vblByb2dyZXNzICYmIHsgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG5hbWVOb2RlcyA9IGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uKTtcbiAgY29uc3QgY2FuZGlkYXRlczogRXhwb3J0RmluZGluZ0NhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbmFtZU5vZGUgb2YgbmFtZU5vZGVzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gICAgY29uc3Qgb3RoZXJGaWxlUmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgIT09IGRlY2xhcmF0aW9uRmlsZVBhdGgpO1xuXG4gICAgaWYgKG90aGVyRmlsZVJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoe1xuICAgICAgICAgIGN1cnJlbnRFeHBvc3VyZTogJ2V4cG9ydCcsXG4gICAgICAgICAgZmxhZ3M6IHsgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCwgaXNGb3JjZWRCeVRlc3RPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgIG5hbWVOb2RlLFxuICAgICAgICAgIG5vZGU6IGRlY2xhcmF0aW9uLFxuICAgICAgICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiAnZmlsZS1sb2NhbCdcbiAgICAgICAgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSBvdGhlckZpbGVSZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG4gICAgaWYgKG5vblRlc3RSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKHtcbiAgICAgICAgICBjdXJyZW50RXhwb3N1cmU6ICdleHBvcnQnLFxuICAgICAgICAgIGZsYWdzOiB7IGhhc05vUmVmZXJlbmNlczogZmFsc2UsIGlzRm9yY2VkQnlUZXN0T25seTogdHJ1ZSB9LFxuICAgICAgICAgIG5hbWVOb2RlLFxuICAgICAgICAgIG5vZGU6IGRlY2xhcmF0aW9uLFxuICAgICAgICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiAnZmlsZS1sb2NhbCdcbiAgICAgICAgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYW5Ecm9wRXhwb3J0ID0gY2FuZGlkYXRlcy5sZW5ndGggPT09IG5hbWVOb2Rlcy5sZW5ndGggJiYgY2FuZGlkYXRlcy5ldmVyeSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaXNQbGFpbkZpbGVMb2NhbCB8fCBjb250ZXh0LnNob3VsZEZvcmNlKTtcbiAgY29uc3QgZXhwb3J0RWRpdCA9IGNhbkRyb3BFeHBvcnQgPyBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb24pIDogbnVsbDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHJlY29yZCh7XG4gICAgICBjb250ZXh0LFxuICAgICAgZWRpdDogZXhwb3J0RWRpdCxcbiAgICAgIGZpbmRpbmc6IGNhbmRpZGF0ZS5maW5kaW5nXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5hbHl6ZU1lbWJlcihub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgbWVtYmVyID0gYXNDbGFzc01lbWJlcihub2RlKTtcbiAgaWYgKCFtZW1iZXIgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IG1lbWJlci5uYW1lO1xuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGlmIChpc1ByaXZhdGVJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG1lbWJlcik7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpIHx8IG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuT3ZlcnJpZGVLZXl3b3JkKSB8fCBMSUZFQ1lDTEVfQUxMT1dMSVNULmhhcyhuYW1lTm9kZS5nZXRUZXh0KCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChtZW1iZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4cG9zdXJlID0gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHMpO1xuICBpZiAoY3VycmVudEV4cG9zdXJlID09PSAncHJpdmF0ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZGlyZWN0UmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCByZWZlcmVuY2VzID0gWy4uLmRpcmVjdFJlZmVyZW5jZXMsIC4uLmNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyh7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCBuYW1lTm9kZSB9KV07XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZSh7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCByZWZlcmVuY2VzOiBub25UZXN0UmVmZXJlbmNlcyB9KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5lZWRlZFdpdGhUZXN0cyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZSh7IGNvbnRleHQsIGRlY2xhcmluZ0NsYXNzLCByZWZlcmVuY2VzIH0pO1xuICBjb25zdCBmaW5kaW5nID0gYnVpbGRGaW5kaW5nKHtcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmxhZ3M6IHtcbiAgICAgIGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsXG4gICAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHJhbmtFeHBvc3VyZShuZWVkZWRXaXRoVGVzdHMpID4gcmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYylcbiAgICB9LFxuICAgIG5hbWVOb2RlLFxuICAgIG5vZGU6IG1lbWJlcixcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZTogbmVlZGVkRm9yU3JjXG4gIH0pO1xuICByZWNvcmQoe1xuICAgIGNvbnRleHQsXG4gICAgZWRpdDogY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXIsIG5lZWRlZEZvclNyYyksXG4gICAgZmluZGluZ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFZGl0cyh0ZXh0OiBzdHJpbmcsIGVkaXRzOiByZWFkb25seSBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1bmlxdWVFZGl0cyA9IGVkaXRzXG4gICAgLmZpbHRlcigoZWRpdCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7U3RyaW5nKGVkaXQuc3RhcnQpfToke1N0cmluZyhlZGl0Lmxlbmd0aCl9OiR7ZWRpdC5uZXdUZXh0fWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xuXG4gIGxldCByZXN1bHQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgdW5pcXVlRWRpdHMpIHtcbiAgICByZXN1bHQgPSBgJHtyZXN1bHQuc2xpY2UoMCwgZWRpdC5zdGFydCl9JHtlZGl0Lm5ld1RleHR9JHtyZXN1bHQuc2xpY2UoZWRpdC5zdGFydCArIGVkaXQubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocGFyYW1zOiBBcHBseU92ZXJFeHBvc3VyZUZpeGVzUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgeyBwcm9ncmFtLCByZXN1bHQsIHNob3VsZEZvcmNlLCB3cml0ZUZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgZWRpdHNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXT4oKTtcbiAgY29uc3QgZmluZGluZ3MgPSByZXN1bHQuZmluZGluZ3MubWFwKChmaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVkaXQgPSByZXN1bHQuZWRpdHNbaW5kZXhdID8/IG51bGw7XG4gICAgY29uc3Qgc2tpcFJlYXNvbiA9IGRldGVybWluZVNraXBSZWFzb24oeyBlZGl0LCBmaW5kaW5nLCBzaG91bGRGb3JjZSB9KTtcbiAgICBpZiAoc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbiwgd2FzRml4ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVkaXQsICdBIGZpeGFibGUgZmluZGluZyBtdXN0IGNhcnJ5IGEgdGV4dCBlZGl0LicpO1xuICAgIGNvbnN0IGZpbGVFZGl0cyA9IGVkaXRzQnlGaWxlLmdldChlZGl0LmZpbGVOYW1lKSA/PyBbXTtcbiAgICBmaWxlRWRpdHMucHVzaChlZGl0KTtcbiAgICBlZGl0c0J5RmlsZS5zZXQoZWRpdC5maWxlTmFtZSwgZmlsZUVkaXRzKTtcbiAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uOiBudWxsLCB3YXNGaXhlZDogdHJ1ZSB9O1xuICB9KTtcblxuICBpZiAoZWRpdHNCeUZpbGUuc2l6ZSA+IDApIHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQSBwcm9ncmFtIGlzIGV4cGVjdGVkIHdoZW4gdGhlcmUgYXJlIGVkaXRzIHRvIGFwcGx5LicpO1xuICAgIGNvbnN0IHNvdXJjZVRleHRCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgU291cmNlRmlsZVRleHQ+KCk7XG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKSkge1xuICAgICAgc291cmNlVGV4dEJ5RmlsZS5zZXQodG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksIHsgZmlsZU5hbWU6IHNvdXJjZUZpbGUuZmlsZU5hbWUsIHRleHQ6IHNvdXJjZUZpbGUudGV4dCB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbY2Fub25pY2FsRmlsZU5hbWUsIGZpbGVFZGl0c10gb2YgZWRpdHNCeUZpbGUpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZVRleHRCeUZpbGUuZ2V0KGNhbm9uaWNhbEZpbGVOYW1lKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2Nhbm9uaWNhbEZpbGVOYW1lfWApO1xuICAgICAgd3JpdGVGaWxlKHNvdXJjZS5maWxlTmFtZSwgYXBwbHlFZGl0cyhzb3VyY2UudGV4dCwgZmlsZUVkaXRzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbmRpbmdzO1xufVxuXG5mdW5jdGlvbiBhc0NsYXNzTWVtYmVyKG5vZGU6IE5vZGUpOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkgfHwgaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG5vZGUpIHx8IGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSB8fCBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc0V4cG9ydGFibGVEZWNsYXJhdGlvbihub2RlOiBOb2RlKTogRXhwb3J0YWJsZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIGlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNFbnVtRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpXG4gICkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhwYXJhbXM6IEJ1aWxkRmluZGluZ1BhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCB7IGN1cnJlbnRFeHBvc3VyZSwgZmxhZ3MsIG5hbWVOb2RlLCBub2RlLCBzdWdnZXN0ZWRFeHBvc3VyZSB9ID0gcGFyYW1zO1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBza2lwUmVhc29uOiBudWxsLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgIHdhc0ZpeGVkOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFN0cmluZ0xpdGVyYWxJbmRleChwcm9ncmFtOiBQcm9ncmFtKTogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+KCk7XG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbGxlY3RJbk5vZGUoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RJbk5vZGUobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGlmIChpc1N0cmluZ0xpdGVyYWxMaWtlKG5vZGUpKSB7XG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGluZGV4LmdldChub2RlLnRleHQpID8/IFtdO1xuICAgICAgb2NjdXJyZW5jZXMucHVzaCh7IG5vZGUsIHNvdXJjZUZpbGU6IG5vZGUuZ2V0U291cmNlRmlsZSgpIH0pO1xuICAgICAgaW5kZXguc2V0KG5vZGUudGV4dCwgb2NjdXJyZW5jZXMpO1xuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZChjb2xsZWN0SW5Ob2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzKHBhcmFtczogQ29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzUGFyYW1zKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIG5hbWVOb2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGV4dC5zdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQuZ2V0KG5hbWVOb2RlLmdldFRleHQoKSk7XG4gIGlmICghb2NjdXJyZW5jZXMgfHwgb2NjdXJyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qga2V5U2V0ID0gZ2V0Q2xhc3NLZXlTZXQoZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQuY2hlY2tlcik7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBvY2N1cnJlbmNlIG9mIG9jY3VycmVuY2VzKSB7XG4gICAgaWYgKGlzS2V5UmVmZXJlbmNlVG9DbGFzcyh7IGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwga2V5U2V0LCBub2RlOiBvY2N1cnJlbmNlLm5vZGUgfSkpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiBvY2N1cnJlbmNlLnNvdXJjZUZpbGUuZmlsZU5hbWUsIHN0YXJ0OiBvY2N1cnJlbmNlLm5vZGUuZ2V0U3RhcnQoKSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZGVjbGFyYXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShtb2RpZmllcnMsICdNb2RpZmllcnMgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IGV4cG9ydE1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpO1xuICBhc3NlcnROb25OdWxsYWJsZShleHBvcnRNb2RpZmllciwgJ0V4cG9ydCBtb2RpZmllciBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgeyB0ZXh0IH0gPSBzb3VyY2VGaWxlO1xuICBsZXQgZW5kID0gZXhwb3J0TW9kaWZpZXIuZ2V0RW5kKCk7XG4gIHdoaWxlIChlbmQgPCB0ZXh0Lmxlbmd0aCAmJiBXSElURVNQQUNFX1BBVFRFUk4udGVzdCh0ZXh0LmNoYXJBdChlbmQpKSkge1xuICAgIGVuZCsrO1xuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWU6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGxlbmd0aDogZW5kIC0gZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICBuZXdUZXh0OiAnJyxcbiAgICBzdGFydDogZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlcjogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiwgc3VnZ2VzdGVkRXhwb3N1cmU6ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnKTogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgaWYgKChnZXREZWNvcmF0b3JzKG1lbWJlcikgPz8gW10pLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmaWxlTmFtZSA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMobWVtYmVyKSA/PyBbXTtcbiAgY29uc3QgdmlzaWJpbGl0eU1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTLmhhcyhtb2RpZmllci5raW5kKSk7XG4gIGlmICh2aXNpYmlsaXR5TW9kaWZpZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBsZW5ndGg6IHZpc2liaWxpdHlNb2RpZmllci5nZXRFbmQoKSAtIHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpLFxuICAgICAgbmV3VGV4dDogc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgICBzdGFydDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KClcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZmlyc3RNb2RpZmllciA9IG1vZGlmaWVyc1swXTtcbiAgY29uc3QgaW5zZXJ0U3RhcnQgPSBmaXJzdE1vZGlmaWVyID8gZmlyc3RNb2RpZmllci5nZXRTdGFydCgpIDogbWVtYmVyLmdldFN0YXJ0KCk7XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWUsXG4gICAgbGVuZ3RoOiAwLFxuICAgIG5ld1RleHQ6IGAke3N1Z2dlc3RlZEV4cG9zdXJlfSBgLFxuICAgIHN0YXJ0OiBpbnNlcnRTdGFydFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTmVlZGVkRXhwb3N1cmUocGFyYW1zOiBDb21wdXRlTmVlZGVkRXhwb3N1cmVQYXJhbXMpOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSA9IHBhcmFtcztcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBwb3NpdGlvbjogcmVmZXJlbmNlLnN0YXJ0LCBwcm9ncmFtOiBjb250ZXh0LnByb2dyYW0gfSk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHsgYmFzZTogZGVjbGFyaW5nQ2xhc3MsIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwgZGVyaXZlZDogcmVmZXJlbmNlQ2xhc3MgfSkpIHtcbiAgICAgIG5lZWRlZCA9ICdwcm90ZWN0ZWQnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiAncHVibGljJztcbiAgfVxuICByZXR1cm4gbmVlZGVkO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmcud2FzRml4ZWQpIHtcbiAgICByZXR1cm4gJyBbZml4ZWRdJztcbiAgfVxuICBpZiAoZmluZGluZy5za2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGAgW3NraXBwZWQ6ICR7U0tJUF9SRUFTT05fREVTQ1JJUFRJT05bZmluZGluZy5za2lwUmVhc29uXX1dYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYHJlZmVyZW5jZWQgb25seSAke1NDT1BFX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmVdfWA7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiBgJHtiYXNlfSAoZXhwb3NlZCBvbmx5IGZvciB0ZXN0cylgO1xuICB9XG4gIGlmIChmaW5kaW5nLmhhc05vUmVmZXJlbmNlcykge1xuICAgIHJldHVybiBgJHtiYXNlfSAobm8gcmVmZXJlbmNlcyBhdCBhbGwpYDtcbiAgfVxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lU2tpcFJlYXNvbihwYXJhbXM6IERldGVybWluZVNraXBSZWFzb25QYXJhbXMpOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbiB7XG4gIGNvbnN0IHsgZWRpdCwgZmluZGluZywgc2hvdWxkRm9yY2UgfSA9IHBhcmFtcztcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKHsgYmFzZUZvbGRlciwgZmlsZVBhdGggfSkpO1xuICAgIGZvciAoY29uc3QgZmluZGluZyBvZiBzb3J0ZWQpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCR7U3RyaW5nKGZpbmRpbmcubGluZSl9OiR7U3RyaW5nKGZpbmRpbmcuY29sdW1uKX1gLnBhZEVuZChsb2NhdGlvbldpZHRoKTtcbiAgICAgIGNvbnN0IGNoYW5nZSA9IGAke2ZpbmRpbmcuY3VycmVudEV4cG9zdXJlfSAke2ZpbmRpbmcubmFtZX0gLT4gJHtmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlfWA7XG4gICAgICBsaW5lcy5wdXNoKGAgICR7bG9jYXRpb259ICAke2NoYW5nZX0gLS0gJHtkZXNjcmliZVJlYXNvbihmaW5kaW5nKX0ke2Rlc2NyaWJlRml4U3RhdHVzKGZpbmRpbmcpfWApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuICByZXR1cm4gbGluZXM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFN1bW1hcnkoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHN1bW1hcnkgPSBgJHtTdHJpbmcoZmluZGluZ3MubGVuZ3RoKX0gZmluZGluZyhzKS5gO1xuICBjb25zdCBmaXhlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLndhc0ZpeGVkKS5sZW5ndGg7XG4gIGNvbnN0IHNraXBwZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy5za2lwUmVhc29uICE9PSBudWxsKS5sZW5ndGg7XG4gIGlmIChmaXhlZENvdW50ID09PSAwICYmIHNraXBwZWRDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBzdW1tYXJ5O1xuICB9XG4gIHJldHVybiBgJHtzdW1tYXJ5fSAke1N0cmluZyhmaXhlZENvdW50KX0gZml4ZWQsICR7U3RyaW5nKHNraXBwZWRDb3VudCl9IHNraXBwZWQuYDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xhc3NBdFBvc2l0aW9uKHBhcmFtczogR2V0Q2xhc3NBdFBvc2l0aW9uUGFyYW1zKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGZpbGVOYW1lLCBwb3NpdGlvbiwgcHJvZ3JhbSB9ID0gcGFyYW1zO1xuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVOYW1lKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlRmlsZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2ZpbGVOYW1lfWApO1xuICBjb25zdCBub2RlID0gZmluZE5vZGVBdFBvc2l0aW9uKHNvdXJjZUZpbGUsIHBvc2l0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobm9kZSwgYE5vIG5vZGUgZm91bmQgYXQgcG9zaXRpb24gJHtTdHJpbmcocG9zaXRpb24pfSBpbiAke2ZpbGVOYW1lfWApO1xuICByZXR1cm4gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzS2V5U2V0KGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiwgY2hlY2tlcjogVHlwZUNoZWNrZXIpOiBSZWFkb25seVNldDxzdHJpbmc+IHtcbiAgY29uc3QgY2xhc3NTeW1ib2wgPSBkZWNsYXJpbmdDbGFzcy5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGRlY2xhcmluZ0NsYXNzLm5hbWUpIDogdW5kZWZpbmVkO1xuICBjb25zdCBjbGFzc1R5cGUgPSBjbGFzc1N5bWJvbCA/IGNoZWNrZXIuZ2V0RGVjbGFyZWRUeXBlT2ZTeW1ib2woY2xhc3NTeW1ib2wpIDogY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcyk7XG4gIHJldHVybiBuZXcgU2V0KGNsYXNzVHlwZS5nZXRQcm9wZXJ0aWVzKCkubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kczogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3Byb3RlY3RlZCc7XG4gIH1cbiAgcmV0dXJuICdwdWJsaWMnO1xufVxuXG5mdW5jdGlvbiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlOiBOb2RlKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogTm9kZSA9IG5vZGU7XG4gIHdoaWxlICghaXNTb3VyY2VGaWxlKGN1cnJlbnQpKSB7XG4gICAgaWYgKGlzQ2xhc3NMaWtlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBOb2RlW10ge1xuICBpZiAoaXNWYXJpYWJsZVN0YXRlbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5tYXAoKHZhcmlhYmxlRGVjbGFyYXRpb24pID0+IHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSkuZmlsdGVyKGlzSWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWUgPyBbZGVjbGFyYXRpb24ubmFtZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpZXJLaW5kcyhub2RlOiBOb2RlKTogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4ge1xuICBjb25zdCBraW5kcyA9IG5ldyBTZXQ8U3ludGF4S2luZD4oKTtcbiAgaWYgKGNhbkhhdmVNb2RpZmllcnMobm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGdldE1vZGlmaWVycyhub2RlKSA/PyBbXSkge1xuICAgICAga2luZHMuYWRkKG1vZGlmaWVyLmtpbmQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2luZHM7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHModHlwZTogVHlwZSk6IG51bGwgfCBzdHJpbmdbXSB7XG4gIGlmICh0eXBlLmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgcmV0dXJuIFt0eXBlLnZhbHVlXTtcbiAgfVxuICBpZiAodHlwZS5pc1VuaW9uKCkpIHtcbiAgICBjb25zdCBsaXRlcmFsczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnN0aXR1ZW50IG9mIHR5cGUudHlwZXMpIHtcbiAgICAgIGlmICghY29uc3RpdHVlbnQuaXNTdHJpbmdMaXRlcmFsKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsaXRlcmFscy5wdXNoKGNvbnN0aXR1ZW50LnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpdGVyYWxzO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBoYXNUc0RvY0NvbW1lbnQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGZ1bGxUZXh0ID0gc291cmNlRmlsZS5nZXRGdWxsVGV4dCgpO1xuICBjb25zdCBjb21tZW50UmFuZ2VzID0gZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMoZnVsbFRleHQsIG5vZGUuZ2V0RnVsbFN0YXJ0KCkpID8/IFtdO1xuICByZXR1cm4gY29tbWVudFJhbmdlcy5zb21lKChyYW5nZSkgPT5cbiAgICByYW5nZS5raW5kID09PSBTeW50YXhLaW5kLk11bHRpTGluZUNvbW1lbnRUcml2aWFcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCkgPT09ICcqJ1xuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCkgIT09ICcvJ1xuICApO1xufVxuXG5mdW5jdGlvbiBpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZTogUmVmZXJlbmNlTG9jYXRpb24sIG5hbWVOb2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpID09PSB0b0Nhbm9uaWNhbChuYW1lTm9kZS5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWUpICYmIHJlZmVyZW5jZS5zdGFydCA9PT0gbmFtZU5vZGUuZ2V0U3RhcnQoKTtcbn1cblxuZnVuY3Rpb24gaXNEZXJpdmVkRnJvbShwYXJhbXM6IElzRGVyaXZlZEZyb21QYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhc2VTeW1ib2wgPSBiYXNlLm5hbWUgPyBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oYmFzZS5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFiYXNlU3ltYm9sKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBjbGF1c2Ugb2YgZGVyaXZlZC5oZXJpdGFnZUNsYXVzZXMgPz8gW10pIHtcbiAgICBpZiAoY2xhdXNlLnRva2VuICE9PSBTeW50YXhLaW5kLkV4dGVuZHNLZXl3b3JkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0eXBlRXhwcmVzc2lvbiBvZiBjbGF1c2UudHlwZXMpIHtcbiAgICAgIGNvbnN0ICRzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKCRzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mICRzeW1ib2w/LmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoaXNDbGFzc0xpa2UoZGVjbGFyYXRpb24pICYmIGlzRGVyaXZlZEZyb20oeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkOiBkZWNsYXJhdGlvbiB9KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKHBhcmFtczogSXNLZXlSZWZlcmVuY2VUb0NsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgY2hlY2tlciwga2V5U2V0LCBub2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICBpZiAoIWxpdGVyYWxzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSk7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShwYXJhbXM6IElzT3duU291cmNlRmlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGZpbGVQYXRoLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7c3JjRm9sZGVyfS9gKSAmJiBmaWxlUGF0aC5lbmRzV2l0aCgnLnRzJykgJiYgIWZpbGVQYXRoLmVuZHNXaXRoKCcuZC50cycpO1xufVxuXG5mdW5jdGlvbiBpc1Rlc3RGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVQYXRoLmluY2x1ZGVzKCcudGVzdC4nKSB8fCBmaWxlUGF0aC5pbmNsdWRlcygnLmludGVncmF0aW9uLicpO1xufVxuXG5mdW5jdGlvbiByYW5rRXhwb3N1cmUoZXhwb3N1cmU6IE1lbWJlckV4cG9zdXJlKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1FTUJFUl9FWFBPU1VSRV9PUkRFUi5pbmRleE9mKGV4cG9zdXJlKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkKHBhcmFtczogUmVjb3JkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgY29udGV4dCwgZWRpdCwgZmluZGluZyB9ID0gcGFyYW1zO1xuICBjb250ZXh0LmZpbmRpbmdzLnB1c2goZmluZGluZyk7XG4gIGNvbnRleHQuZWRpdHMucHVzaChlZGl0KTtcbn1cblxuZnVuY3Rpb24gcnVuT3ZlckV4cG9zdXJlQW5hbHlzaXMocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogQW5hbHlzaXNSZXN1bHQge1xuICBjb25zdCB7IGxhbmd1YWdlU2VydmljZSwgb25Qcm9ncmVzcywgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHByb2dyYW0gPSBsYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpO1xuICBpZiAoIXByb2dyYW0pIHtcbiAgICByZXR1cm4geyBlZGl0czogW10sIGZpbmRpbmdzOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgY29udGV4dDogQW5hbHlzaXNDb250ZXh0ID0ge1xuICAgIGNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBlZGl0czogW10sXG4gICAgZmluZGluZ3M6IFtdLFxuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBwcm9ncmFtLFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UsXG4gICAgc3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VzQnlUZXh0OiBidWlsZFN0cmluZ0xpdGVyYWxJbmRleChwcm9ncmFtKVxuICB9O1xuXG4gIGNvbnN0IHNvdXJjZUZpbGVzVG9BbmFseXplID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLmZpbHRlcigoc291cmNlRmlsZSkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgcmV0dXJuIGlzT3duU291cmNlRmlsZSh7IGZpbGVQYXRoLCBzcmNGb2xkZXIgfSkgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4geyBlZGl0czogY29udGV4dC5lZGl0cywgZmluZGluZ3M6IGNvbnRleHQuZmluZGluZ3MgfTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Rpc3BsYXlQYXRoKHBhcmFtczogVG9EaXNwbGF5UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYmFzZUZvbGRlciwgZmlsZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKGJhc2VGb2xkZXIgIT09IHVuZGVmaW5lZCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke2Jhc2VGb2xkZXJ9L2ApKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKGJhc2VGb2xkZXIubGVuZ3RoICsgMSk7XG4gIH1cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
756
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyB0aWdodGVuZWQgaW4gcGxhY2UgdmlhIHtAbGluayB3cml0ZUZpbGV9ICh3aGljaCBtdXN0IHRoZW5cbiAgICogYmUgcHJvdmlkZWQpLCBhbmQgdGhlIHJldHVybmVkIGZpbmRpbmdzIGNhcnJ5IHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gT25seSBkZWNsYXJhdGlvbnMgaW4gbm9uLXRlc3QgZmlsZXNcbiAgICogdW5kZXIgdGhpcyBmb2xkZXIgYXJlIGFuYWx5emVkOyBkZWNsYXJhdGlvbnMgZWxzZXdoZXJlICh0ZXN0IGZpbGVzLCBkZXBlbmRlbmNpZXMpIGFyZSBpZ25vcmVkXG4gICAqIGJ1dCBzdGlsbCBjb3VudGVkIGFzIHJlZmVyZW5jZSBzaXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHNob3VsZEZpeH1cbiAgICogaXMgYHRydWVgOyBpZ25vcmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHdyaXRlIChvcmlnaW5hbCBjYXNpbmcsIGFzIHN0b3JlZCBpbiB0aGUgcHJvZ3JhbSkuXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGZ1bGwgbmV3IGZpbGUgY29udGVudHMuXG4gICAqL1xuICB3cml0ZUZpbGU/KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgY29tcGlsZXIgb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKlxuICBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gIFRoZSBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHVzZWQgdG8gcmVhZCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogT3ZlckV4cG9zdXJlRmlsZVN5c3RlbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZml4YWJsZSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIGluIHBsYWNlIG9uIGRpc2sgKHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIGRyb3BwZWQsXG4gICAqIG9yIGEgYHByaXZhdGVgIC8gYHByb3RlY3RlZGAgbW9kaWZpZXIgaXMgaW5zZXJ0ZWQvcmVwbGFjZWQpLiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlXG4gICAqIHByb2plY3QgaXMgb25seSBhbmFseXplZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgZGlyZWN0b3J5RXhpc3RzKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgZmlsZSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZmlsZSBleGlzdHMuXG4gICAqL1xuICBmaWxlRXhpc3RzKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVzb2x2ZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3JpZXMgb2YgYSBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSwgZmlsdGVyZWQgYnkgZXh0ZW5zaW9uIGFuZCBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgZmlsZSBhcyB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGZpbGUgY29udGVudHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcmVhZEZpbGUodGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgLyoqXG4gIDEtYmFzZWQgY29sdW1uIG9mIHRoZSBkZWNsYXJhdGlvbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW46IG51bWJlcjtcblxuICAvKipcbiAgVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgKGJlc2lkZXMgaXRzZWxmKS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIHdvdWxkIHF1YWxpZnkgZm9yIGEgdGlnaHRlciBleHBvc3VyZSBpZiBub3QgZm9yIHJlZmVyZW5jZXMgY29taW5nXG4gICAqIGV4Y2x1c2l2ZWx5IGZyb20gdGVzdCBmaWxlcyBcdTIwMTQgaS5lLiBpdCBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqXG4gIGB0cnVlYCBmb3IgYSBjbGFzcyBtZW1iZXIsIGBmYWxzZWAgZm9yIGEgdG9wLWxldmVsIGV4cG9ydC5cbiAgICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIGRlY2xhcmVkIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluIGEgZml4IHJ1biwgd2h5IHRoaXMgZmluZGluZyB3YXMgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiB0aWdodGVuZWQ7IGBudWxsYCB3aGVuIGl0IHdhc1xuICAgKiBmaXhlZCBvciB3aGVuIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydGVkIChgc2hvdWxkRml4YCBvZmYpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFJlYXNvbjogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb247XG5cbiAgLyoqXG4gIFRoZSBleHBvc3VyZSB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgdGlnaHRlbmVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKlxuICBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IHdhc0ZpeGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb2dyZXNzIHJlcG9ydGVkIHdoaWxlIGFuYWx5emluZyBhIHByb2plY3QsIG9uZSBldmVudCBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlUHJvZ3Jlc3Mge1xuICAvKipcbiAgTnVtYmVyIG9mIHNvdXJjZSBmaWxlcyBmdWxseSBhbmFseXplZCBiZWZvcmUgdGhlIGN1cnJlbnQgb25lICgwLWJhc2VkKS5cbiAgICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxGaWxlQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaHkgYSBmaXggcnVuIGxlZnQgYSBmaW5kaW5nIHVudG91Y2hlZDpcbiAqXG4gKiAtIGBkZWNvcmF0ZWRgIFx1MjAxNCB0aGUgbWVtYmVyIGNhcnJpZXMgYSBkZWNvcmF0b3IsIHNvIHRoZSBtb2RpZmllciBpbnNlcnRpb24gcG9pbnQgaXMgYW1iaWd1b3VzLlxuICogLSBgc2hhcmVkLWV4cG9ydGAgXHUyMDE0IHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBkZWNsYXJhdG9yLlxuICogLSBgdGVzdC1vbmx5YCBcdTIwMTQgdGhlIGRlY2xhcmF0aW9uIGlzIGV4cG9zZWQgcHVyZWx5IGZvciB0ZXN0cywgc28gdGlnaHRlbmluZyB3b3VsZCBicmVhayB0aGUgdGVzdC5cbiAqL1xuZXhwb3J0IHR5cGUgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbiA9ICdkZWNvcmF0ZWQnIHwgJ3NoYXJlZC1leHBvcnQnIHwgJ3Rlc3Qtb25seSc7XG5cbi8qKlxuICogVGhlICh0aWdodGVyKSBleHBvc3VyZSBsZXZlbCBhIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHJlZHVjZWQgdG8uXG4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RlZEV4cG9zdXJlID0gJ2ZpbGUtbG9jYWwnIHwgJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCc7XG5cbi8qKlxuICogTGlmZWN5Y2xlIGFuZCBmcmFtZXdvcmsgbWVtYmVycyBpbnZva2VkIGJ5IE9ic2lkaWFuIG9yIGEgYmFzZSBjbGFzcyB2aWEgcmVnaXN0cmF0aW9uIHJhdGhlciB0aGFuXG4gKiBieSByZWZlcmVuY2VzIHRoZSBsYW5ndWFnZSBzZXJ2aWNlIGNhbiBzZWUuIFRpZ2h0ZW5pbmcgdGhlc2Ugd291bGQgYnJlYWsgdGhlIGZyYW1ld29yayBjb250cmFjdCxcbiAqIHNvIHRoZXkgYXJlIG5ldmVyIHJlcG9ydGVkLlxuICovXG5leHBvcnQgY29uc3QgTElGRUNZQ0xFX0FMTE9XTElTVDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdkaXNwbGF5JyxcbiAgJ2hpZGUnLFxuICAnb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlJyxcbiAgJ29uTGF5b3V0UmVhZHknLFxuICAnb25sb2FkJyxcbiAgJ29ubG9hZEltcGwnLFxuICAnb25Mb2FkU2V0dGluZ3MnLFxuICAnb25TYXZlU2V0dGluZ3MnLFxuICAnb251bmxvYWQnLFxuICAnb251bmxvYWRJbXBsJ1xuXSk7XG5cbmludGVyZmFjZSBBbmFseXNpc0NvbnRleHQge1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcbiAgcmVhZG9ubHkgZWRpdHM6IChudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpW107XG4gIHJlYWRvbmx5IGZpbmRpbmdzOiBPdmVyRXhwb3N1cmVGaW5kaW5nW107XG4gIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlO1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xuICByZWFkb25seSBzaG91bGRGb3JjZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VzQnlUZXh0OiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+O1xufVxuXG5pbnRlcmZhY2UgQW5hbHlzaXNSZXN1bHQge1xuICByZWFkb25seSBlZGl0czogcmVhZG9ubHkgKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXBwbHlPdmVyRXhwb3N1cmVGaXhlc30uXG4gKi9cbmludGVyZmFjZSBBcHBseU92ZXJFeHBvc3VyZUZpeGVzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBwcm9ncmFtIHdob3NlIHNvdXJjZSBmaWxlcyBzdXBwbHkgdGhlIG9yaWdpbmFsIHRleHQgdGhlIGVkaXRzIGFyZSBhcHBsaWVkIHRvOyBgdW5kZWZpbmVkYCB3aGVuIG5vIHByb2dyYW0gaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIGFuYWx5c2lzIHJlc3VsdCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIHR1cm5lZCBpbnRvIGluLXBsYWNlIGZpeGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdDtcblxuICAvKipcbiAgV2hlbiBgdHJ1ZWAsIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyBhcmUgdGlnaHRlbmVkIHRvbyBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZTogYm9vbGVhbjtcblxuICAvKipcbiAgV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLlxuICAgKi9cbiAgd3JpdGVGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRGaW5kaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEJ1aWxkRmluZGluZ1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbCBvZiB0aGUgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKipcbiAgRmxhZ3MgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgb3IgaXMgZm9yY2VkIHdpZGUgYnkgdGVzdC1vbmx5IHJlZmVyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBmbGFnczogRmluZGluZ0ZsYWdzO1xuXG4gIC8qKlxuICBUaGUgZGVjbGFyYXRpb24ncyBuYW1lIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgcG9zaXRpb24gYW5kIHRleHQuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcblxuICAvKipcbiAgVGhlIGRlY2xhcmF0aW9uIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuXG4gIC8qKlxuICBUaGUgdGlnaHRlciBleHBvc3VyZSBsZXZlbCB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZTtcbn1cblxudHlwZSBDbGFzc01lbWJlckRlY2xhcmF0aW9uID0gR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb247XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlc30uXG4gKi9cbmludGVyZmFjZSBDb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIGFuYWx5c2lzIGNvbnRleHQgcHJvdmlkaW5nIHRoZSBzdHJpbmctbGl0ZXJhbCBpbmRleCBhbmQgdHlwZSBjaGVja2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZW1iZXIgd2hvc2UgbmFtZSB0aGUgc3RyaW5nIGxpdGVyYWxzIG1pZ2h0IHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIG1lbWJlcidzIG5hbWUgbm9kZSwgd2hvc2UgdGV4dCBpcyBtYXRjaGVkIGFnYWluc3Qgc3RyaW5nLWxpdGVyYWwgb2NjdXJyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29tcHV0ZU5lZWRlZEV4cG9zdXJlfS5cbiAqL1xuaW50ZXJmYWNlIENvbXB1dGVOZWVkZWRFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCBwcm92aWRpbmcgdGhlIHByb2dyYW0gYW5kIHR5cGUgY2hlY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKipcbiAgVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5lZWRlZCBleHBvc3VyZSBpcyBjb21wdXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIHJlZmVyZW5jZSBsb2NhdGlvbnMgdGhhdCBtdXN0IHJlbWFpbiByZWFjaGFibGUgYXQgdGhlIGNvbXB1dGVkIGV4cG9zdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGV0ZXJtaW5lU2tpcFJlYXNvbn0uXG4gKi9cbmludGVyZmFjZSBEZXRlcm1pbmVTa2lwUmVhc29uUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSB0ZXh0IGVkaXQgdGhhdCB3b3VsZCB0aWdodGVuIHRoZSBmaW5kaW5nLCBvciBgbnVsbGAgd2hlbiBubyBzYWZlIGVkaXQgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0O1xuXG4gIC8qKlxuICBUaGUgZmluZGluZyB1bmRlciBjb25zaWRlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcblxuICAvKipcbiAgV2hlbiBgdHJ1ZWAsIHRlc3Qtb25seSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIHJhdGhlciB0aGFuIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZTogYm9vbGVhbjtcbn1cblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldENsYXNzQXRQb3NpdGlvbn0uXG4gKi9cbmludGVyZmFjZSBHZXRDbGFzc0F0UG9zaXRpb25QYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwb3NpdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIDAtYmFzZWQgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBwcm9ncmFtIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0Rlcml2ZWRGcm9tfS5cbiAqL1xuaW50ZXJmYWNlIElzRGVyaXZlZEZyb21QYXJhbXMge1xuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBiYXNlIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIGhlcml0YWdlIHN5bWJvbHMuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBkZXJpdmVkIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzS2V5UmVmZXJlbmNlVG9DbGFzc30uXG4gKi9cbmludGVyZmFjZSBJc0tleVJlZmVyZW5jZVRvQ2xhc3NQYXJhbXMge1xuICAvKipcbiAgVGhlIHR5cGUgY2hlY2tlciB1c2VkIHRvIHJlc29sdmUgdGhlIGxpdGVyYWwncyBjb250ZXh0dWFsIHR5cGUuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIHNldCBvZiBwcm9wZXJ0eSBrZXlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGtleVNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgVGhlIHN0cmluZy1saXRlcmFsIG5vZGUgYmVpbmcgdGVzdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZTogU3RyaW5nTGl0ZXJhbExpa2U7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzT3duU291cmNlRmlsZX0uXG4gKi9cbmludGVyZmFjZSBJc093blNvdXJjZUZpbGVQYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgZmlsZSB1bmRlciB0ZXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG50eXBlIE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuLyoqXG4gKiBBIHNpbmdsZSBpbi1wbGFjZSB0ZXh0IHJlcGxhY2VtZW50IHRoYXQgdGlnaHRlbnMgYSBkZWNsYXJhdGlvbidzIGV4cG9zdXJlLiBBIHplcm8tbGVuZ3RoIGVkaXQgaXNcbiAqIGFuIGluc2VydGlvbiAoZS5nLiBhZGRpbmcgYW4gZXhwbGljaXQgYHByaXZhdGVgIG1vZGlmaWVyIHRvIGFuIGltcGxpY2l0bHktYHB1YmxpY2AgbWVtYmVyKS5cbiAqL1xuaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5ld1RleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVjb3JkfS5cbiAqL1xuaW50ZXJmYWNlIFJlY29yZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIGFwcGVuZGVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgdGV4dCBlZGl0IHRoYXQgd291bGQgdGlnaHRlbiB0aGUgZmluZGluZywgb3IgYG51bGxgIHdoZW4gbm8gc2FmZSBlZGl0IGV4aXN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKipcbiAgVGhlIGZpbmRpbmcgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbn1cblxuaW50ZXJmYWNlIFJlZmVyZW5jZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNvdXJjZUZpbGVUZXh0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2Uge1xuICByZWFkb25seSBub2RlOiBTdHJpbmdMaXRlcmFsTGlrZTtcbiAgcmVhZG9ubHkgc291cmNlRmlsZTogU291cmNlRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9EaXNwbGF5UGF0aH0uXG4gKi9cbmludGVyZmFjZSBUb0Rpc3BsYXlQYXRoUGFyYW1zIHtcbiAgLyoqXG4gIFdoZW4gc2V0LCB0aGUgcGF0aCBpcyByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlcjsgcGF0aHMgb3V0c2lkZSBpdCBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIHRvIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyh7XG4gICAgcHJvZ3JhbTogcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksXG4gICAgcmVzdWx0LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UsXG4gICAgd3JpdGVGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgJiYgeyBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayBcdTIwMTQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQgXHUyMDE0IHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDogXHUyMDI2XWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbGFyYXRpb25GaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyh7XG4gICAgICAgICAgY3VycmVudEV4cG9zdXJlOiAnZXhwb3J0JyxcbiAgICAgICAgICBmbGFnczogeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoe1xuICAgICAgICAgIGN1cnJlbnRFeHBvc3VyZTogJ2V4cG9ydCcsXG4gICAgICAgICAgZmxhZ3M6IHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsIHx8IGNvbnRleHQuc2hvdWxkRm9yY2UpO1xuICBjb25zdCBleHBvcnRFZGl0ID0gY2FuRHJvcEV4cG9ydCA/IGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbikgOiBudWxsO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgcmVjb3JkKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlZGl0OiBleHBvcnRFZGl0LFxuICAgICAgZmluZGluZzogY2FuZGlkYXRlLmZpbmRpbmdcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhbmFseXplTWVtYmVyKG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBtZW1iZXIgPSBhc0NsYXNzTWVtYmVyKG5vZGUpO1xuICBpZiAoIW1lbWJlciB8fCAhaXNDbGFzc0xpa2Uobm9kZS5wYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gbWVtYmVyLm5hbWU7XG4gIGNvbnN0IGRlY2xhcmluZ0NsYXNzID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKGlzUHJpdmF0ZUlkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kaWZpZXJLaW5kcyA9IGdldE1vZGlmaWVyS2luZHMobWVtYmVyKTtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgfHwgbW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5PdmVycmlkZUtleXdvcmQpIHx8IExJRkVDWUNMRV9BTExPV0xJU1QuaGFzKG5hbWVOb2RlLmdldFRleHQoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KG1lbWJlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50RXhwb3N1cmUgPSBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kcyk7XG4gIGlmIChjdXJyZW50RXhwb3N1cmUgPT09ICdwcml2YXRlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBkaXJlY3RSZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBbLi4uZGlyZWN0UmVmZXJlbmNlcywgLi4uY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIG5hbWVOb2RlIH0pXTtcbiAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG5cbiAgY29uc3QgbmVlZGVkRm9yU3JjID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXM6IG5vblRlc3RSZWZlcmVuY2VzIH0pO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSk7XG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcoe1xuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmbGFnczoge1xuICAgICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICAgIH0sXG4gICAgbmFtZU5vZGUsXG4gICAgbm9kZTogbWVtYmVyLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiBuZWVkZWRGb3JTcmNcbiAgfSk7XG4gIHJlY29yZCh7XG4gICAgY29udGV4dCxcbiAgICBlZGl0OiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlciwgbmVlZGVkRm9yU3JjKSxcbiAgICBmaW5kaW5nXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhwYXJhbXM6IEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCB7IHByb2dyYW0sIHJlc3VsdCwgc2hvdWxkRm9yY2UsIHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbih7IGVkaXQsIGZpbmRpbmcsIHNob3VsZEZvcmNlIH0pO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0VudW1EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSlcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaW5kaW5nKHBhcmFtczogQnVpbGRGaW5kaW5nUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIGNvbnN0IHsgY3VycmVudEV4cG9zdXJlLCBmbGFncywgbmFtZU5vZGUsIG5vZGUsIHN1Z2dlc3RlZEV4cG9zdXJlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgeyBjaGFyYWN0ZXIsIGxpbmUgfSA9IHNvdXJjZUZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24obmFtZU5vZGUuZ2V0U3RhcnQoKSk7XG4gIHJldHVybiB7XG4gICAgY29sdW1uOiBjaGFyYWN0ZXIgKyAxLFxuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgaGFzTm9SZWZlcmVuY2VzOiBmbGFncy5oYXNOb1JlZmVyZW5jZXMsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiBmbGFncy5pc0ZvcmNlZEJ5VGVzdE9ubHksXG4gICAgaXNNZW1iZXI6IGN1cnJlbnRFeHBvc3VyZSAhPT0gJ2V4cG9ydCcsXG4gICAgbGluZTogbGluZSArIDEsXG4gICAgbmFtZTogbmFtZU5vZGUuZ2V0VGV4dCgpLFxuICAgIHNraXBSZWFzb246IG51bGwsXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgd2FzRml4ZWQ6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW06IFByb2dyYW0pOiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4oKTtcbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKSkge1xuICAgIGlmIChzb3VyY2VGaWxlLmlzRGVjbGFyYXRpb25GaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29sbGVjdEluTm9kZShzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdEluTm9kZShub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgaWYgKGlzU3RyaW5nTGl0ZXJhbExpa2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gaW5kZXguZ2V0KG5vZGUudGV4dCkgPz8gW107XG4gICAgICBvY2N1cnJlbmNlcy5wdXNoKHsgbm9kZSwgc291cmNlRmlsZTogbm9kZS5nZXRTb3VyY2VGaWxlKCkgfSk7XG4gICAgICBpbmRleC5zZXQobm9kZS50ZXh0LCBvY2N1cnJlbmNlcyk7XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKGNvbGxlY3RJbk5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VzKHJlZmVyZW5jZWRTeW1ib2xzOiBSZWZlcmVuY2VkU3ltYm9sW10gfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRTeW1ib2wgb2YgcmVmZXJlbmNlZFN5bWJvbHMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VkU3ltYm9sLnJlZmVyZW5jZXMpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHN0YXJ0OiByZWZlcmVuY2UudGV4dFNwYW4uc3RhcnQgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMocGFyYW1zOiBDb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXNQYXJhbXMpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgbmFtZU5vZGUgfSA9IHBhcmFtcztcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKHsgY2hlY2tlcjogY29udGV4dC5jaGVja2VyLCBrZXlTZXQsIG5vZGU6IG9jY3VycmVuY2Uubm9kZSB9KSkge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IG9jY3VycmVuY2Uuc291cmNlRmlsZS5maWxlTmFtZSwgc3RhcnQ6IG9jY3VycmVuY2Uubm9kZS5nZXRTdGFydCgpIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhkZWNsYXJhdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG1vZGlmaWVycywgJ01vZGlmaWVycyBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgZXhwb3J0TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCk7XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4cG9ydE1vZGlmaWVyLCAnRXhwb3J0IG1vZGlmaWVyIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCB7IHRleHQgfSA9IHNvdXJjZUZpbGU7XG4gIGxldCBlbmQgPSBleHBvcnRNb2RpZmllci5nZXRFbmQoKTtcbiAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoICYmIFdISVRFU1BBQ0VfUEFUVEVSTi50ZXN0KHRleHQuY2hhckF0KGVuZCkpKSB7XG4gICAgZW5kKys7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZTogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgbGVuZ3RoOiBlbmQgLSBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpLFxuICAgIG5ld1RleHQ6ICcnLFxuICAgIHN0YXJ0OiBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uLCBzdWdnZXN0ZWRFeHBvc3VyZTogJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcpOiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBpZiAoKGdldERlY29yYXRvcnMobWVtYmVyKSA/PyBbXSkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhtZW1iZXIpID8/IFtdO1xuICBjb25zdCB2aXNpYmlsaXR5TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IFZJU0lCSUxJVFlfTU9ESUZJRVJfS0lORFMuaGFzKG1vZGlmaWVyLmtpbmQpKTtcbiAgaWYgKHZpc2liaWxpdHlNb2RpZmllcikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGxlbmd0aDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldEVuZCgpIC0gdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgICBuZXdUZXh0OiBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICAgIHN0YXJ0OiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBmaXJzdE1vZGlmaWVyID0gbW9kaWZpZXJzWzBdO1xuICBjb25zdCBpbnNlcnRTdGFydCA9IGZpcnN0TW9kaWZpZXIgPyBmaXJzdE1vZGlmaWVyLmdldFN0YXJ0KCkgOiBtZW1iZXIuZ2V0U3RhcnQoKTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZSxcbiAgICBsZW5ndGg6IDAsXG4gICAgbmV3VGV4dDogYCR7c3VnZ2VzdGVkRXhwb3N1cmV9IGAsXG4gICAgc3RhcnQ6IGluc2VydFN0YXJ0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZWVkZWRFeHBvc3VyZShwYXJhbXM6IENvbXB1dGVOZWVkZWRFeHBvc3VyZVBhcmFtcyk6IE1lbWJlckV4cG9zdXJlIHtcbiAgY29uc3QgeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlcyB9ID0gcGFyYW1zO1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbih7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHBvc2l0aW9uOiByZWZlcmVuY2Uuc3RhcnQsIHByb2dyYW06IGNvbnRleHQucHJvZ3JhbSB9KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20oeyBiYXNlOiBkZWNsYXJpbmdDbGFzcywgY2hlY2tlcjogY29udGV4dC5jaGVja2VyLCBkZXJpdmVkOiByZWZlcmVuY2VDbGFzcyB9KSkge1xuICAgICAgbmVlZGVkID0gJ3Byb3RlY3RlZCc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiBuZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRml4U3RhdHVzKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZy53YXNGaXhlZCkge1xuICAgIHJldHVybiAnIFtmaXhlZF0nO1xuICB9XG4gIGlmIChmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gYCBbc2tpcHBlZDogJHtTS0lQX1JFQVNPTl9ERVNDUklQVElPTltmaW5kaW5nLnNraXBSZWFzb25dfV1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgcmVmZXJlbmNlZCBvbmx5ICR7U0NPUEVfREVTQ1JJUFRJT05bZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZV19YDtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChleHBvc2VkIG9ubHkgZm9yIHRlc3RzKWA7XG4gIH1cbiAgaWYgKGZpbmRpbmcuaGFzTm9SZWZlcmVuY2VzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVTa2lwUmVhc29uKHBhcmFtczogRGV0ZXJtaW5lU2tpcFJlYXNvblBhcmFtcyk6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgY29uc3QgeyBlZGl0LCBmaW5kaW5nLCBzaG91bGRGb3JjZSB9ID0gcGFyYW1zO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkgJiYgIXNob3VsZEZvcmNlKSB7XG4gICAgcmV0dXJuICd0ZXN0LW9ubHknO1xuICB9XG4gIGlmICghZWRpdCkge1xuICAgIHJldHVybiBmaW5kaW5nLmlzTWVtYmVyID8gJ2RlY29yYXRlZCcgOiAnc2hhcmVkLWV4cG9ydCc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlQXRQb3NpdGlvbihub2RlOiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChwb3NpdGlvbiA8IG5vZGUuZ2V0U3RhcnQoKSB8fCBwb3NpdGlvbiA+PSBub2RlLmdldEVuZCgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgcmVzdWx0OiBOb2RlID0gbm9kZTtcbiAgbm9kZS5mb3JFYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZUF0UG9zaXRpb24oY2hpbGQsIHBvc2l0aW9uKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IGZvdW5kO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbmRpbmdCbG9ja3MoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSwgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlRmluZGluZ1tdPigpO1xuICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlGaWxlLmdldChmaW5kaW5nLmZpbGVQYXRoKSA/PyBbXTtcbiAgICBsaXN0LnB1c2goZmluZGluZyk7XG4gICAgYnlGaWxlLnNldChmaW5kaW5nLmZpbGVQYXRoLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgbGlzdF0gb2YgYnlGaWxlKSB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IGEubGluZSAtIGIubGluZSk7XG4gICAgY29uc3QgbG9jYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLnNvcnRlZC5tYXAoKGZpbmRpbmcpID0+IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5sZW5ndGgpKTtcbiAgICBsaW5lcy5wdXNoKHRvRGlzcGxheVBhdGgoeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9KSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocGFyYW1zOiBHZXRDbGFzc0F0UG9zaXRpb25QYXJhbXMpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHBvc2l0aW9uLCBwcm9ncmFtIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZU5hbWUpO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7ZmlsZU5hbWV9YCk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kTm9kZUF0UG9zaXRpb24oc291cmNlRmlsZSwgcG9zaXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShub2RlLCBgTm8gbm9kZSBmb3VuZCBhdCBwb3NpdGlvbiAke1N0cmluZyhwb3NpdGlvbil9IGluICR7ZmlsZU5hbWV9YCk7XG4gIHJldHVybiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xhc3NLZXlTZXQoZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IFJlYWRvbmx5U2V0PHN0cmluZz4ge1xuICBjb25zdCBjbGFzc1N5bWJvbCA9IGRlY2xhcmluZ0NsYXNzLm5hbWUgPyBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsYXNzVHlwZSA9IGNsYXNzU3ltYm9sID8gY2hlY2tlci5nZXREZWNsYXJlZFR5cGVPZlN5bWJvbChjbGFzc1N5bWJvbCkgOiBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKGRlY2xhcmluZ0NsYXNzKTtcbiAgcmV0dXJuIG5ldyBTZXQoY2xhc3NUeXBlLmdldFByb3BlcnRpZXMoKS5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzOiBSZWFkb25seVNldDxTeW50YXhLaW5kPik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJvdGVjdGVkJztcbiAgfVxuICByZXR1cm4gJ3B1YmxpYyc7XG59XG5cbmZ1bmN0aW9uIGdldEVuY2xvc2luZ0NsYXNzKG5vZGU6IE5vZGUpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBOb2RlID0gbm9kZTtcbiAgd2hpbGUgKCFpc1NvdXJjZUZpbGUoY3VycmVudCkpIHtcbiAgICBpZiAoaXNDbGFzc0xpa2UoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE5vZGVbXSB7XG4gIGlmIChpc1ZhcmlhYmxlU3RhdGVtZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLm1hcCgodmFyaWFibGVEZWNsYXJhdGlvbikgPT4gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKS5maWx0ZXIoaXNJZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gZGVjbGFyYXRpb24ubmFtZSA/IFtkZWNsYXJhdGlvbi5uYW1lXSA6IFtdO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmllcktpbmRzKG5vZGU6IE5vZGUpOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiB7XG4gIGNvbnN0IGtpbmRzID0gbmV3IFNldDxTeW50YXhLaW5kPigpO1xuICBpZiAoY2FuSGF2ZU1vZGlmaWVycyhub2RlKSkge1xuICAgIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgZ2V0TW9kaWZpZXJzKG5vZGUpID8/IFtdKSB7XG4gICAgICBraW5kcy5hZGQobW9kaWZpZXIua2luZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBraW5kcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nTGl0ZXJhbENvbnN0aXR1ZW50cyh0eXBlOiBUeXBlKTogbnVsbCB8IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGUuaXNTdHJpbmdMaXRlcmFsKCkpIHtcbiAgICByZXR1cm4gW3R5cGUudmFsdWVdO1xuICB9XG4gIGlmICh0eXBlLmlzVW5pb24oKSkge1xuICAgIGNvbnN0IGxpdGVyYWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc3RpdHVlbnQgb2YgdHlwZS50eXBlcykge1xuICAgICAgaWYgKCFjb25zdGl0dWVudC5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxpdGVyYWxzLnB1c2goY29uc3RpdHVlbnQudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbGl0ZXJhbHM7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGhhc1RzRG9jQ29tbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZnVsbFRleHQgPSBzb3VyY2VGaWxlLmdldEZ1bGxUZXh0KCk7XG4gIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyhmdWxsVGV4dCwgbm9kZS5nZXRGdWxsU3RhcnQoKSkgPz8gW107XG4gIHJldHVybiBjb21tZW50UmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgIHJhbmdlLmtpbmQgPT09IFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYVxuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUKSA9PT0gJyonXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUKSAhPT0gJy8nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKHBhcmFtczogSXNEZXJpdmVkRnJvbVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGJhc2UsIGNoZWNrZXIsIGRlcml2ZWQgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3QgJHN5bWJvbCA9IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24odHlwZUV4cHJlc3Npb24uZXhwcmVzc2lvbikuZ2V0U3ltYm9sKCk7XG4gICAgICBpZiAoJHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgJHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbSh7IGJhc2UsIGNoZWNrZXIsIGRlcml2ZWQ6IGRlY2xhcmF0aW9uIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0tleVJlZmVyZW5jZVRvQ2xhc3MocGFyYW1zOiBJc0tleVJlZmVyZW5jZVRvQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBjaGVja2VyLCBrZXlTZXQsIG5vZGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29udGV4dHVhbFR5cGUgPSBjaGVja2VyLmdldENvbnRleHR1YWxUeXBlKG5vZGUpO1xuICBpZiAoIWNvbnRleHR1YWxUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxpdGVyYWxzID0gZ2V0U3RyaW5nTGl0ZXJhbENvbnN0aXR1ZW50cyhjb250ZXh0dWFsVHlwZSk7XG4gIGlmICghbGl0ZXJhbHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWxzLmV2ZXJ5KChsaXRlcmFsKSA9PiBrZXlTZXQuaGFzKGxpdGVyYWwpKTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKHBhcmFtczogSXNPd25Tb3VyY2VGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQocGFyYW1zOiBSZWNvcmRQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBjb250ZXh0LCBlZGl0LCBmaW5kaW5nIH0gPSBwYXJhbXM7XG4gIGNvbnRleHQuZmluZGluZ3MucHVzaChmaW5kaW5nKTtcbiAgY29udGV4dC5lZGl0cy5wdXNoKGVkaXQpO1xufVxuXG5mdW5jdGlvbiBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBBbmFseXNpc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbGFuZ3VhZ2VTZXJ2aWNlLCBvblByb2dyZXNzLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmICghcHJvZ3JhbSkge1xuICAgIHJldHVybiB7IGVkaXRzOiBbXSwgZmluZGluZ3M6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQgPSB7XG4gICAgY2hlY2tlcjogcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpLFxuICAgIGVkaXRzOiBbXSxcbiAgICBmaW5kaW5nczogW10sXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByb2dyYW0sXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSxcbiAgICBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW0pXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9KSAmJiAhaXNUZXN0RmlsZShmaWxlUGF0aCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2FuYWx5emVkRmlsZUNvdW50LCBzb3VyY2VGaWxlXSBvZiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5lbnRyaWVzKCkpIHtcbiAgICBvblByb2dyZXNzPy4oe1xuICAgICAgYW5hbHl6ZWRGaWxlQ291bnQsXG4gICAgICBjdXJyZW50RmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgICAgdG90YWxGaWxlQ291bnQ6IHNvdXJjZUZpbGVzVG9BbmFseXplLmxlbmd0aFxuICAgIH0pO1xuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiB7IGVkaXRzOiBjb250ZXh0LmVkaXRzLCBmaW5kaW5nczogY29udGV4dC5maW5kaW5ncyB9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhbmFseXplTWVtYmVyKG5vZGUsIGNvbnRleHQpO1xuICAgIGFuYWx5emVFeHBvcnQobm9kZSwgY29udGV4dCk7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgocGFyYW1zOiBUb0Rpc3BsYXlQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9ID0gcGFyYW1zO1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwRUEsd0JBMEJPO0FBRVAseUJBQWtDO0FBQ2xDLGlDQUdPO0FBc1NBLE1BQU0sc0JBQTJDLG9CQUFJLElBQVk7QUFBQSxFQUN0RTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUE2UkQsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSx3QkFBbUQsQ0FBQyxXQUFXLGFBQWEsUUFBUTtBQUMxRixNQUFNLG9CQUF1RDtBQUFBLEVBQzNELGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFDZjtBQUNBLE1BQU0sMEJBQWtFO0FBQUEsRUFDdEUsYUFBYTtBQUFBLEVBQ2IsaUJBQWlCO0FBQUEsRUFDakIsYUFBYTtBQUNmO0FBQ0EsTUFBTSw0QkFBcUQsb0JBQUksSUFBZ0IsQ0FBQyw2QkFBVyxnQkFBZ0IsNkJBQVcsa0JBQWtCLDZCQUFXLGFB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LFFBQU0sRUFBRSxTQUFTLE1BQU0sUUFBUSxJQUFJO0FBQ25DLFVBQVEsU0FBUyxLQUFLLE9BQU87QUFDN0IsVUFBUSxNQUFNLEtBQUssSUFBSTtBQUN6QjtBQUVBLFNBQVMsd0JBQXdCLFFBQW1EO0FBQ2xGLFFBQU0sRUFBRSxpQkFBaUIsWUFBWSxVQUFVLElBQUk7QUFDbkQsUUFBTSxVQUFVLGdCQUFnQixXQUFXO0FBQzNDLE1BQUksQ0FBQyxTQUFTO0FBQ1osV0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0FBQUEsRUFDbkM7QUFFQSxRQUFNLFVBQTJCO0FBQUEsSUFDL0IsU0FBUyxRQUFRLGVBQWU7QUFBQSxJQUNoQyxPQUFPLENBQUM7QUFBQSxJQUNSLFVBQVUsQ0FBQztBQUFBLElBQ1g7QUFBQSxJQUNBO0FBQUEsSUFDQSxhQUFhLE9BQU8sZUFBZTtBQUFBLElBQ25DLGdDQUFnQyx3QkFBd0IsT0FBTztBQUFBLEVBQ2pFO0FBRUEsUUFBTSx1QkFBdUIsUUFBUSxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7QUFDM0UsVUFBTSxlQUFXLHdDQUFZLFdBQVcsUUFBUTtBQUNoRCxXQUFPLGdCQUFnQixFQUFFLFVBQVUsVUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLFFBQVE7QUFBQSxFQUN6RSxDQUFDO0FBRUQsYUFBVyxDQUFDLG1CQUFtQixVQUFVLEtBQUsscUJBQXFCLFFBQVEsR0FBRztBQUM1RSxpQkFBYTtBQUFBLE1BQ1g7QUFBQSxNQUNBLHFCQUFpQix3Q0FBWSxXQUFXLFFBQVE7QUFBQSxNQUNoRCxnQkFBZ0IscUJBQXFCO0FBQUEsSUFDdkMsQ0FBQztBQUNELFVBQU0sVUFBVTtBQUFBLEVBQ2xCO0FBQ0EsU0FBTyxFQUFFLE9BQU8sUUFBUSxPQUFPLFVBQVUsUUFBUSxTQUFTO0FBRTFELFdBQVMsTUFBTSxNQUFrQjtBQUMvQixrQkFBYyxNQUFNLE9BQU87QUFDM0Isa0JBQWMsTUFBTSxPQUFPO0FBQzNCLFNBQUssYUFBYSxLQUFLO0FBQUEsRUFDekI7QUFDRjtBQUVBLFNBQVMsY0FBYyxRQUFxQztBQUMxRCxRQUFNLEVBQUUsWUFBWSxTQUFTLElBQUk7QUFDakMsTUFBSSxlQUFlLFVBQWEsU0FBUyxXQUFXLEdBQUcsVUFBVSxHQUFHLEdBQUc7QUFDckUsV0FBTyxTQUFTLE1BQU0sV0FBVyxTQUFTLENBQUM7QUFBQSxFQUM3QztBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -172,25 +172,35 @@ export interface FormatOverExposureFindingsOptions {
|
|
|
172
172
|
*/
|
|
173
173
|
export interface OverExposureFileSystem {
|
|
174
174
|
/**
|
|
175
|
+
* Checks whether a directory exists.
|
|
176
|
+
*
|
|
175
177
|
* @param path - Directory path.
|
|
176
178
|
* @returns `true` when the directory exists.
|
|
177
179
|
*/
|
|
178
180
|
directoryExists(this: void, path: string): boolean;
|
|
179
181
|
/**
|
|
182
|
+
* Checks whether a file exists.
|
|
183
|
+
*
|
|
180
184
|
* @param path - File path.
|
|
181
185
|
* @returns `true` when the file exists.
|
|
182
186
|
*/
|
|
183
187
|
fileExists(this: void, path: string): boolean;
|
|
184
188
|
/**
|
|
189
|
+
* Resolves the directory that relative paths are resolved against.
|
|
190
|
+
*
|
|
185
191
|
* @returns The current working directory.
|
|
186
192
|
*/
|
|
187
193
|
getCurrentDirectory(this: void): string;
|
|
188
194
|
/**
|
|
195
|
+
* Lists the immediate subdirectories of a directory.
|
|
196
|
+
*
|
|
189
197
|
* @param path - Directory path.
|
|
190
198
|
* @returns The immediate subdirectory names.
|
|
191
199
|
*/
|
|
192
200
|
getDirectories(this: void, path: string): string[];
|
|
193
201
|
/**
|
|
202
|
+
* Lists the files under a directory, filtered by extension and include/exclude patterns.
|
|
203
|
+
*
|
|
194
204
|
* @param path - Root directory.
|
|
195
205
|
* @param extensions - Extensions to include.
|
|
196
206
|
* @param exclude - Patterns to exclude.
|
|
@@ -200,6 +210,8 @@ export interface OverExposureFileSystem {
|
|
|
200
210
|
*/
|
|
201
211
|
readDirectory(this: void, path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
|
|
202
212
|
/**
|
|
213
|
+
* Reads a file as text.
|
|
214
|
+
*
|
|
203
215
|
* @param path - File path.
|
|
204
216
|
* @returns The file contents, or `undefined` when absent.
|
|
205
217
|
*/
|
|
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
const LIBRARY_VERSION = "92.
|
|
24
|
+
const LIBRARY_VERSION = "92.1.0";
|
|
25
25
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover,\n.obsidian-dev-utils.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-explicit-close.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-dev-utils.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-dev-utils.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-dev-utils.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-dev-utils.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;AChCF;EACE;;;ACCJ;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
26
26
|
export {
|
|
27
27
|
LIBRARY_STYLES,
|
|
@@ -112,6 +112,11 @@ export type PatchHandlerFunction<$Object extends object, MethodName extends Meth
|
|
|
112
112
|
* @typeParam MethodName - The method name being patched.
|
|
113
113
|
*/
|
|
114
114
|
export interface PatchHandlerParams<$Object extends object, MethodName extends MethodKeys<$Object>> {
|
|
115
|
+
/**
|
|
116
|
+
* Invokes the original method with the original `this` and arguments.
|
|
117
|
+
*
|
|
118
|
+
* @returns Whatever the original method returns.
|
|
119
|
+
*/
|
|
115
120
|
fallback(this: void): ReturnType<ExtractFunction<$Object, MethodName>>;
|
|
116
121
|
/**
|
|
117
122
|
* The original arguments of the intercepted call, as a tuple.
|