@secrethub/ngx-stripe
Version:
The core package for ngx-stripe, for using stripe.js in your application
220 lines • 23.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { filter, first } from 'rxjs/operators';
import { StripeLoader } from './stripe-loader.service';
import * as i0 from "@angular/core";
import * as i1 from "./stripe-loader.service";
export class StripeService {
/**
* Lazy load the StripeJS javascript file on first usage of the service
* @param {?} loader - The loader that should be used for loading StripeJS
*/
constructor(loader) {
this.loader = loader;
/**
* A BehaviorSubject containing the StripeJS object
*
* Since the script is loaded Async we need an options for all our functions
* to wait for stripe to have been loaded
*/
this.stripe$ = new BehaviorSubject(null);
loader.loadScript()
.subscribe((stripe) => this.stripe$.next(stripe), () => {
throw new Error('Stripe could not be loaded!');
});
}
/**
* Creates a new stripe instance with the given key
* @param {?} key - The public key that should be used to communicate with Stripe
* @param {?=} options - Any options to configure StripeJS
* @return {?}
*/
changeKey(key, options) {
this.stripe$.next(StripeLoader.getStripeInstance(key, options));
}
/**
* Configures the `Elements` object from StripeJS with the given options
* @see https://stripe.com/docs/stripe-js/elements/quickstart#create-form
* @param {?=} options
* @param {?=} isIETFLocaleTag
* @return {?} Observable that resolves in an StripeJS ElementsCreator
*/
getElementFactory(options, isIETFLocaleTag = false) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (isIETFLocaleTag && options && options.locale) {
options.locale = options.locale.split('-')[0]; // Only use the first part of the locale 'en' for example
}
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.elements(options);
});
}
/**
* Create a payment request
* NOTE: This is NOT supported for Firefox
* @see https://stripe.com/docs/payment-request-api
*
* @param {?} options - Payment information that should be used by Stripe
*
* @return {?} the created request
*/
makePaymentRequest(options) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.paymentRequest(options);
});
}
/**
* Creates a token from the given element
*
* @param {?} element - The element from which the data needs to be extracted
* @param {?=} data
* @return {?} A promise that resolves in a token or a rejection if the creation of the token failed
*/
createTokenFromElement(element, data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.createToken(element, data).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.token;
});
});
}
/**
* Creates a token from a bank account
*
* @param {?} data - The data from the bank account that should be used for the token
*
* @return {?} A promise that resolves in a token or a rejection if the creation of the token failed
*/
createTokenFromBankAccount(data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.createToken('bank_account', data).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.token;
});
});
}
/**
* Creates a token from the personal information of a customer
*
* @param {?} data - The personal information that should be used for the creation of the token
*
* @return {?} A promise that resolves in a token or a rejection if the creation of the token failed
*/
createTokenFromPii(data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.createToken('pii', data).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.token;
});
});
}
/**
* Creates a source object from the given element and data
*
* @param {?} element - The element from which the data needs to be extracted
* @param {?} data - An object containing the type of Source you want to create and any additional payment source information
*
* @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed
*/
createSourceFromElement(element, data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.createSource(element, data).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.source;
});
});
}
/**
* Creates a source object from only data
*
* @param {?} data - The data that should be used for the creation of the source object
*
* @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed
*/
createSourceFromData(data) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.createSource(data).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.source;
});
});
}
/**
* Fetches an existing source based on the given parameters
*
* @param {?} id - The unique identifier of the source
* @param {?} client_secret - A secret available to the web client that created the Source
*
* @return {?} A promise that resolves in a source object or a rejection if the creation of the source failed
*/
getSource(id, client_secret) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const stripe = yield this.getStripe();
return stripe.retrieveSource({ id, client_secret }).then((result) => {
if (result.error) {
Promise.reject(result.error);
}
return result.source;
});
});
}
/**
* Fetches the StripeJS instance
* NOTE: Use the instance for token generation
*
* @return {?} The StripeJS instance when it is available (since StripeJS is loaded Async)
*/
getStripe() {
return this.stripe$.pipe(filter((stripe) => !!stripe), first()).toPromise().then((stripe) => stripe);
}
}
StripeService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
},] }
];
StripeService.ctorParameters = () => [
{ type: StripeLoader }
];
/** @nocollapse */ StripeService.ngInjectableDef = i0.defineInjectable({ factory: function StripeService_Factory() { return new StripeService(i0.inject(i1.StripeLoader)); }, token: StripeService, providedIn: "root" });
if (false) {
/**
* A BehaviorSubject containing the StripeJS object
*
* Since the script is loaded Async we need an options for all our functions
* to wait for stripe to have been loaded
* @type {?}
*/
StripeService.prototype.stripe$;
/** @type {?} */
StripeService.prototype.loader;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VjcmV0aHViL25neC1zdHJpcGUvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvc3RyaXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBTXpDLE9BQU8sRUFBQyxlQUFlLEVBQWEsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUM7OztBQUtyRCxNQUFNOzs7OztJQWFKLFlBQW9CLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFaeEM7Ozs7O1dBS0c7UUFDSyxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO1FBTzNELE1BQU0sQ0FBQyxVQUFVLEVBQUU7YUFDaEIsU0FBUyxDQUNSLENBQUMsTUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQy9DLEdBQUcsRUFBRTtZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7Ozs7Ozs7SUFPTSxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTZCO1FBQ3pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDOzs7Ozs7OztJQVdZLGlCQUFpQixDQUFDLE9BQStCLEVBQUUsZUFBZSxHQUFHLEtBQUs7O1lBQ3JGLElBQUksZUFBZSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUNoRCxPQUFP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QU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM5QjtnQkFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQUE7Ozs7Ozs7OztJQVVZLFNBQVMsQ0FBQyxFQUFVLEVBQUUsYUFBcUI7OztrQkFDaEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNyQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBQyxFQUFFLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFvQixFQUFFLEVBQUU7Z0JBQzlFLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtvQkFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlCO2dCQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTs7Ozs7OztJQVFPLFNBQVM7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixNQUFNLENBQUMsQ0FBQyxNQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQzdDLEtBQUssRUFBRSxDQUNSLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBZ0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQzs7O1lBdkxGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBSk8sWUFBWTs7Ozs7Ozs7Ozs7SUFZbEIsZ0NBQTZEOztJQU1qRCwrQkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1N0cmlwZUpTLCBTdHJpcGVDb25maWdPcHRpb25zfSBmcm9tICdzdHJpcGVqcyc7XHJcbmltcG9ydCB7U3RyaXBlRWxlbWVudCwgRWxlbWVudEZhY3RvcnksIEVsZW1lbnRDcmVhdG9yT3B0aW9uc30gZnJvbSAnc3RyaXBlanMvZWxlbWVudCc7XHJcbmltcG9ydCB7U3RyaXBlUGF5bWVudE9wdGlvbnMsIFN0cmlwZVBheW1lbnRSZXF1ZXN0fSBmcm9tICdzdHJpcGVqcy9wYXltZW50JztcclxuaW1wb3J0IHtCYW5rVG9rZW5EYXRhLCBJQkFOVG9rZW5EYXRhLCBQaWlUb2tlbkRhdGEsIFRva2VuLCBUb2tlbkRhdGEsIFRva2VuUmVzdWx0fSBmcm9tICdzdHJpcGVqcy90b2tlbic7XHJcbmltcG9ydCB7U291cmNlLCBTb3VyY2VEYXRhLCBTb3VyY2VSZXN1bHR9IGZyb20gJ3N0cmlwZWpzL3NvdXJjZSc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtmaWx0ZXIsIGZpcnN0fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7U3RyaXBlTG9hZGVyfSBmcm9tICcuL3N0cmlwZS1sb2FkZXIuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RyaXBlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogQSBCZWhhdmlvclN1YmplY3QgY29udGFpbmluZyB0aGUgU3RyaXBlSlMgb2JqZWN0XHJcbiAgICpcclxuICAgKiBTaW5jZSB0aGUgc2NyaXB0IGlzIGxvYWRlZCBBc3luYyB3ZSBuZWVkIGFuIG9wdGlvbnMgZm9yIGFsbCBvdXIgZnVuY3Rpb25zXHJcbiAgICogdG8gd2FpdCBmb3Igc3RyaXBlIHRvIGhhdmUgYmVlbiBsb2FkZWRcclxuICAgKi9cclxuICBwcml2YXRlIHN0cmlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFN0cmlwZUpTIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhenkgbG9hZCB0aGUgU3RyaXBlSlMgamF2YXNjcmlwdCBmaWxlIG9uIGZpcnN0IHVzYWdlIG9mIHRoZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIGxvYWRlciAtIFRoZSBsb2FkZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgbG9hZGluZyBTdHJpcGVKU1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9hZGVyOiBTdHJpcGVMb2FkZXIpIHtcclxuICAgIGxvYWRlci5sb2FkU2NyaXB0KClcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAoc3RyaXBlOiBTdHJpcGVKUykgPT4gdGhpcy5zdHJpcGUkLm5leHQoc3RyaXBlKSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0cmlwZSBjb3VsZCBub3QgYmUgbG9hZGVkIScpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgbmV3IHN0cmlwZSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBrZXlcclxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHB1YmxpYyBrZXkgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIFN0cmlwZVxyXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW55IG9wdGlvbnMgdG8gY29uZmlndXJlIFN0cmlwZUpTXHJcbiAgICovXHJcbiAgcHVibGljIGNoYW5nZUtleShrZXk6IHN0cmluZywgb3B0aW9ucz86IFN0cmlwZUNvbmZpZ09wdGlvbnMpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RyaXBlJC5uZXh0KFN0cmlwZUxvYWRlci5nZXRTdHJpcGVJbnN0YW5jZShrZXksIG9wdGlvbnMpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyZXMgdGhlIGBFbGVtZW50c2Agb2JqZWN0IGZyb20gU3RyaXBlSlMgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xyXG4gICAqIEBzZWUgaHR0cHM6Ly9zdHJpcGUuY29tL2RvY3Mvc3RyaXBlLWpzL2VsZW1lbnRzL3F1aWNrc3RhcnQjY3JlYXRlLWZvcm1cclxuICAgKiBAcGFyYW0gW29wdGlvbnNdIC0gQW55IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEVsZW1lbnRzIG9iamVjdFxyXG4gICAqIEBwYXJhbSBbaXNJRVRGTG9jYWxlVGFnXSAtIFdoZXRoZXIgb3Igbm90IHRoZSBvcHRpb25zIGBsb2NhbGVgIGlzIGZvcm1hdHRlZCBhcyBhIElFVEZMb2NhbGVUYWcuXHJcbiAgICogSWYgdHJ1ZSB0aGUgbG9jYWxlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IHRoaXMgZnVuY3Rpb25cclxuICAgKlxyXG4gICAqIEByZXR1cm4gT2JzZXJ2YWJsZSB0aGF0IHJlc29sdmVzIGluIGFuIFN0cmlwZUpTIEVsZW1lbnRzQ3JlYXRvclxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBnZXRFbGVtZW50RmFjdG9yeShvcHRpb25zPzogRWxlbWVudENyZWF0b3JPcHRpb25zLCBpc0lFVEZMb2NhbGVUYWcgPSBmYWxzZSk6IFByb21pc2U8RWxlbWVudEZhY3Rvcnk+IHtcclxuICAgIGlmIChpc0lFVEZMb2NhbGVUYWcgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmxvY2FsZSkge1xyXG4gICAgICBvcHRpb25zLmxvY2FsZSA9IG9wdGlvbnMubG9jYWxlLnNwbGl0KCctJylbMF07IC8vIE9ubHkgdXNlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBsb2NhbGUgJ2VuJyBmb3IgZXhhbXBsZVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmVsZW1lbnRzKG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgcGF5bWVudCByZXF1ZXN0XHJcbiAgICogTk9URTogVGhpcyBpcyBOT1Qgc3VwcG9ydGVkIGZvciBGaXJlZm94XHJcbiAgICogQHNlZSBodHRwczovL3N0cmlwZS5jb20vZG9jcy9wYXltZW50LXJlcXVlc3QtYXBpXHJcbiAgICpcclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBheW1lbnQgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBieSBTdHJpcGVcclxuICAgKlxyXG4gICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcmVxdWVzdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBtYWtlUGF5bWVudFJlcXVlc3Qob3B0aW9uczogU3RyaXBlUGF5bWVudE9wdGlvbnMpOiBQcm9taXNlPFN0cmlwZVBheW1lbnRSZXF1ZXN0PiB7XHJcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCB0aGlzLmdldFN0cmlwZSgpO1xyXG4gICAgcmV0dXJuIHN0cmlwZS5wYXltZW50UmVxdWVzdChvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB0b2tlbiBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XHJcbiAgICpcclxuICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IGZyb20gd2hpY2ggdGhlIGRhdGEgbmVlZHMgdG8gYmUgZXh0cmFjdGVkXHJcbiAgICogQHBhcmFtIFtkYXRhXSAtIGFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgcGF5bWVudCBpbmZvcm1hdGlvbiB5b3UgbWlnaHQgaGF2ZSBjb2xsZWN0ZWRcclxuICAgKlxyXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW4gYSB0b2tlbiBvciBhIHJlamVjdGlvbiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIHRva2VuIGZhaWxlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVUb2tlbkZyb21FbGVtZW50KGVsZW1lbnQ6IFN0cmlwZUVsZW1lbnQsIGRhdGE/OiBUb2tlbkRhdGEgfCBJQkFOVG9rZW5EYXRhKTogUHJvbWlzZTxUb2tlbj4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUuY3JlYXRlVG9rZW4oZWxlbWVudCwgZGF0YSkudGhlbigocmVzdWx0OiBUb2tlblJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XHJcbiAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0LmVycm9yKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0LnRva2VuO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGEgdG9rZW4gZnJvbSBhIGJhbmsgYWNjb3VudFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSBmcm9tIHRoZSBiYW5rIGFjY291bnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHRva2VuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgdG9rZW4gb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSB0b2tlbiBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlVG9rZW5Gcm9tQmFua0FjY291bnQoZGF0YTogQmFua1Rva2VuRGF0YSk6IFByb21pc2U8VG9rZW4+IHtcclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmNyZWF0ZVRva2VuKCdiYW5rX2FjY291bnQnLCBkYXRhKS50aGVuKChyZXN1bHQ6IFRva2VuUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQudG9rZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB0b2tlbiBmcm9tIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZiBhIGN1c3RvbWVyXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRva2VuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgdG9rZW4gb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSB0b2tlbiBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlVG9rZW5Gcm9tUGlpKGRhdGE6IFBpaVRva2VuRGF0YSk6IFByb21pc2U8VG9rZW4+IHtcclxuICAgIGNvbnN0IHN0cmlwZSA9IGF3YWl0IHRoaXMuZ2V0U3RyaXBlKCk7XHJcbiAgICByZXR1cm4gc3RyaXBlLmNyZWF0ZVRva2VuKCdwaWknLCBkYXRhKS50aGVuKChyZXN1bHQ6IFRva2VuUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQudG9rZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBzb3VyY2Ugb2JqZWN0IGZyb20gdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGRhdGFcclxuICAgKlxyXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgZGF0YSBuZWVkcyB0byBiZSBleHRyYWN0ZWRcclxuICAgKiBAcGFyYW0gZGF0YSAtIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB0eXBlIG9mIFNvdXJjZSB5b3Ugd2FudCB0byBjcmVhdGUgYW5kIGFueSBhZGRpdGlvbmFsIHBheW1lbnQgc291cmNlIGluZm9ybWF0aW9uXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGluIGEgc291cmNlIG9iamVjdCBvciBhIHJlamVjdGlvbiBpZiB0aGUgY3JlYXRpb24gb2YgdGhlIHNvdXJjZSBmYWlsZWRcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlU291cmNlRnJvbUVsZW1lbnQoZWxlbWVudDogU3RyaXBlRWxlbWVudCwgZGF0YTogU291cmNlRGF0YSk6IFByb21pc2U8U291cmNlPiB7XHJcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCB0aGlzLmdldFN0cmlwZSgpO1xyXG4gICAgcmV0dXJuIHN0cmlwZS5jcmVhdGVTb3VyY2UoZWxlbWVudCwgZGF0YSkudGhlbigocmVzdWx0OiBTb3VyY2VSZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdC5lcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdC5zb3VyY2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSBzb3VyY2Ugb2JqZWN0IGZyb20gb25seSBkYXRhXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc291cmNlIG9iamVjdFxyXG4gICAqXHJcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBpbiBhIHNvdXJjZSBvYmplY3Qgb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSBzb3VyY2UgZmFpbGVkXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZVNvdXJjZUZyb21EYXRhKGRhdGE6IFNvdXJjZURhdGEpOiBQcm9taXNlPFNvdXJjZT4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUuY3JlYXRlU291cmNlKGRhdGEpLnRoZW4oKHJlc3VsdDogU291cmNlUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcclxuICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQuZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQuc291cmNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIGFuIGV4aXN0aW5nIHNvdXJjZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGFyYW1ldGVyc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBzb3VyY2VcclxuICAgKiBAcGFyYW0gY2xpZW50X3NlY3JldCAtIEEgc2VjcmV0IGF2YWlsYWJsZSB0byB0aGUgd2ViIGNsaWVudCB0aGF0IGNyZWF0ZWQgdGhlIFNvdXJjZVxyXG4gICAqXHJcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBpbiBhIHNvdXJjZSBvYmplY3Qgb3IgYSByZWplY3Rpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHRoZSBzb3VyY2UgZmFpbGVkXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdldFNvdXJjZShpZDogc3RyaW5nLCBjbGllbnRfc2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZT4ge1xyXG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgdGhpcy5nZXRTdHJpcGUoKTtcclxuICAgIHJldHVybiBzdHJpcGUucmV0cmlldmVTb3VyY2Uoe2lkLCBjbGllbnRfc2VjcmV0fSkudGhlbigocmVzdWx0OiBTb3VyY2VSZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdC5lcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdC5zb3VyY2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIFN0cmlwZUpTIGluc3RhbmNlXHJcbiAgICogTk9URTogVXNlIHRoZSBpbnN0YW5jZSBmb3IgdG9rZW4gZ2VuZXJhdGlvblxyXG4gICAqXHJcbiAgICogQHJldHVybiBUaGUgU3RyaXBlSlMgaW5zdGFuY2Ugd2hlbiBpdCBpcyBhdmFpbGFibGUgKHNpbmNlIFN0cmlwZUpTIGlzIGxvYWRlZCBBc3luYylcclxuICAgKi9cclxuICBwcml2YXRlIGdldFN0cmlwZSgpOiBQcm9taXNlPFN0cmlwZUpTPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdHJpcGUkLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoc3RyaXBlOiBTdHJpcGVKUyB8IG51bGwpID0+ICEhc3RyaXBlKSxcclxuICAgICAgZmlyc3QoKSxcclxuICAgICkudG9Qcm9taXNlKCkudGhlbigoc3RyaXBlOiBTdHJpcGVKUykgPT4gc3RyaXBlKTtcclxuICB9XHJcbn1cclxuIl19