ngx-ice-tweet
Version:
tweeter component to show tweets by a hashtag given, it can be order by text, date, or user name
255 lines (246 loc) • 23.7 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('rxjs'), require('rxjs/operators'), require('@angular/platform-browser'), require('@angular/platform-browser/animations'), require('@angular/forms'), require('@angular/material')) :
typeof define === 'function' && define.amd ? define('ngx-ice-tweet', ['exports', '@angular/core', '@angular/common/http', 'rxjs', 'rxjs/operators', '@angular/platform-browser', '@angular/platform-browser/animations', '@angular/forms', '@angular/material'], factory) :
(factory((global['ngx-ice-tweet'] = {}),global.ng.core,global.ng.common.http,global.rxjs,global.rxjs.operators,global.ng.platformBrowser,global.ng.platformBrowser.animations,global.ng.forms,global.ng.material));
}(this, (function (exports,i0,http,rxjs,operators,platformBrowser,animations,forms,material) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var TweetService = /** @class */ (function () {
function TweetService() {
}
TweetService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
TweetService.ctorParameters = function () { return []; };
/** @nocollapse */ TweetService.ngInjectableDef = i0.defineInjectable({ factory: function TweetService_Factory() { return new TweetService(); }, token: TweetService, providedIn: "root" });
return TweetService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var TweetConfig = {
tokenUrl: 'https://api.twitter.com/oauth2/token',
tweetSearchUrl: 'https://api.twitter.com/1.1/search/tweets.json'
};
var TweetComponent = /** @class */ (function () {
function TweetComponent(http$$1) {
this.http = http$$1;
this.errorMesage = new i0.EventEmitter();
this.filterBy = 'created_at';
this.filterOptions = ['created_at', 'text', 'user.name'];
this._unsubscribeAll = new rxjs.Subject();
}
/**
* @return {?}
*/
TweetComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.evalData()) {
this.getToken();
}
else {
this.sendErrorMesage('No Public, Privite Key');
this.ngOnDestroy();
}
};
/**
* @return {?}
*/
TweetComponent.prototype.setFilterBy = /**
* @return {?}
*/
function () {
var _this = this;
return this.tweets.sort(function (a, b) { return a[_this.filterBy] > b[_this.filterBy] ? 1 : a[_this.filterBy] === b[_this.filterBy] ? 0 : -1; });
};
/**
* @private
* @return {?}
*/
TweetComponent.prototype.evalData = /**
* @private
* @return {?}
*/
function () {
return (this.keyPublic && this.keyPrivate
&& this.keyPublic !== null && this.keyPrivate !== null
&& this.keyPublic !== '' && this.keyPrivate !== '');
};
/**
* @private
* @return {?}
*/
TweetComponent.prototype.evaHash = /**
* @private
* @return {?}
*/
function () {
return (this.hashTag
&& this.hashTag !== null
&& this.hashTag !== '');
};
/**
* @private
* @param {?} token
* @return {?}
*/
TweetComponent.prototype.evalToken = /**
* @private
* @param {?} token
* @return {?}
*/
function (token) {
return (token.token_type && token.access_token
&& token.token_type !== null && token.access_token !== null
&& token.token_type !== '' && token.access_token !== '');
};
/**
* @private
* @return {?}
*/
TweetComponent.prototype.getToken = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.evaHash()) {
/** @type {?} */
var basic = btoa(this.keyPublic + ":" + this.keyPrivate);
/** @type {?} */
var headers = new http.HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': "Basic " + basic
});
/** @type {?} */
var payload = new FormData();
payload.append('grant_type', 'client_credentials');
this.http.post(TweetConfig.tokenUrl, payload, { headers: headers })
.pipe(operators.takeUntil(this._unsubscribeAll))
.subscribe(function (token) { return _this.getTweetList(token); }, function (error) { return _this.sendErrorMesage(error); });
}
else {
this.sendErrorMesage('No HasgTag set For Searching');
}
};
/**
* @private
* @param {?} token
* @return {?}
*/
TweetComponent.prototype.getTweetList = /**
* @private
* @param {?} token
* @return {?}
*/
function (token) {
var _this = this;
if (this.evalToken(token)) {
/** @type {?} */
var headers = new http.HttpHeaders({
'Authorization': token.token_type + " " + token.access_token
});
/** @type {?} */
var params = new http.HttpParams().set('q', "%23" + this.hashTag);
this.http.get(TweetConfig.tweetSearchUrl, { headers: headers, params: params })
.pipe(operators.takeUntil(this._unsubscribeAll))
.subscribe(function (_a) {
var statuses = _a.statuses;
return _this.tweets = ( /** @type {?} */(statuses));
}, function (error) { return _this.sendErrorMesage(error); });
}
else {
this.sendErrorMesage('Error Tweeter Token');
}
};
/**
* @private
* @param {?} men
* @return {?}
*/
TweetComponent.prototype.sendErrorMesage = /**
* @private
* @param {?} men
* @return {?}
*/
function (men) {
this.errorMesage.emit(men);
};
/**
* @return {?}
*/
TweetComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._unsubscribeAll.next();
this._unsubscribeAll.complete();
};
TweetComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'tweet',
template: "<div class=\"container\" *ngIf=\"tweets && tweets.length > 0\">\n <div>\n <h4>filter by:</h4>\n <mat-form-field>\n <mat-select [(value)]=\"filterBy\">\n <mat-option *ngFor=\"let opt of filterOptions\" value=\"opt\">{{opt}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <mat-card\n *ngFor=\"let tt of setFilterBy()\"\n >\n <mat-card-header>\n <mat-card-title>{{tt.user.screen_name}}</mat-card-title>\n <mat-card-subtitle>@{{tt.user.name}}</mat-card-subtitle>\n </mat-card-header>\n <img matCardImage [src]=\"tt.user.profile_image_url\">\n <mat-card-content>\n {{tt.text}}\n </mat-card-content>\n <mat-card-actions align=\"start\">\n <!--<button mat-button (click)=\"onAction1\">Action1</button>-->\n </mat-card-actions>\n <mat-card-footer>\n\n </mat-card-footer>\n </mat-card>\n </div>",
encapsulation: i0.ViewEncapsulation.Native,
styles: ["\n .container {\n width: 100%;\n margin: 2rem;\n display: flex;\n flex-direction: column;\n }\n mat-card {\n margin-bottom: 2rem;\n flex: 1 1 100%;\n }"]
}] }
];
/** @nocollapse */
TweetComponent.ctorParameters = function () {
return [
{ type: http.HttpClient }
];
};
TweetComponent.propDecorators = {
keyPublic: [{ type: i0.Input }],
keyPrivate: [{ type: i0.Input }],
hashTag: [{ type: i0.Input }],
errorMesage: [{ type: i0.Output }]
};
return TweetComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var TweetModule = /** @class */ (function () {
function TweetModule() {
}
TweetModule.decorators = [
{ type: i0.NgModule, args: [{
declarations: [TweetComponent],
imports: [
platformBrowser.BrowserModule,
http.HttpClientModule,
animations.BrowserAnimationsModule,
material.MatCardModule,
material.MatSelectModule,
forms.FormsModule
],
exports: [TweetComponent]
},] }
];
return TweetModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.TweetService = TweetService;
exports.TweetComponent = TweetComponent;
exports.TweetModule = TweetModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWljZS10d2VldC51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1pY2UtdHdlZXQvbGliL3R3ZWV0LnNlcnZpY2UudHMiLCJuZzovL25neC1pY2UtdHdlZXQvbGliL3R3ZWV0LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWljZS10d2VldC9saWIvdHdlZXQubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVHdlZXRTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5jb25zdCBUd2VldENvbmZpZyA9IHtcbiAgdG9rZW5Vcmw6ICdodHRwczovL2FwaS50d2l0dGVyLmNvbS9vYXV0aDIvdG9rZW4nLFxuICB0d2VldFNlYXJjaFVybDogJ2h0dHBzOi8vYXBpLnR3aXR0ZXIuY29tLzEuMS9zZWFyY2gvdHdlZXRzLmpzb24nXG59O1xuXG5pbnRlcmZhY2UgVG9rZW4ge1xuICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHdlZXRzIHtcbiAgY3JlYXRlZF9hdDogRGF0ZTtcbiAgaWQ6IG51bWJlcjtcbiAgaWRfc3RyOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNlcjogYW55O1xuICBlbnRpdGllczogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0d2VldCcsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiICpuZ0lmPVwidHdlZXRzICYmIHR3ZWV0cy5sZW5ndGggPiAwXCI+XG4gICAgPGRpdj5cbiAgICAgIDxoND5maWx0ZXIgYnk6PC9oND5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwiZmlsdGVyQnlcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGZpbHRlck9wdGlvbnNcIiB2YWx1ZT1cIm9wdFwiPnt7b3B0fX08L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gIDxtYXQtY2FyZFxuICAgICpuZ0Zvcj1cImxldCB0dCBvZiBzZXRGaWx0ZXJCeSgpXCJcbiAgPlxuICAgIDxtYXQtY2FyZC1oZWFkZXI+XG4gICAgICA8bWF0LWNhcmQtdGl0bGU+e3t0dC51c2VyLnNjcmVlbl9uYW1lfX08L21hdC1jYXJkLXRpdGxlPlxuICAgICAgPG1hdC1jYXJkLXN1YnRpdGxlPkB7e3R0LnVzZXIubmFtZX19PC9tYXQtY2FyZC1zdWJ0aXRsZT5cbiAgICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgICA8aW1nIG1hdENhcmRJbWFnZSBbc3JjXT1cInR0LnVzZXIucHJvZmlsZV9pbWFnZV91cmxcIj5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIHt7dHQudGV4dH19XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgIDxtYXQtY2FyZC1hY3Rpb25zIGFsaWduPVwic3RhcnRcIj5cbiAgICAgIDwhLS08YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cIm9uQWN0aW9uMVwiPkFjdGlvbjE8L2J1dHRvbj4tLT5cbiAgICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gICAgPG1hdC1jYXJkLWZvb3Rlcj5cblxuICAgIDwvbWF0LWNhcmQtZm9vdGVyPlxuICA8L21hdC1jYXJkPlxuICA8L2Rpdj5gLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1hcmdpbjogMnJlbTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgbWF0LWNhcmQge1xuICAgIG1hcmdpbi1ib3R0b206IDJyZW07XG4gICAgZmxleDogMSAxIDEwMCU7XG4gIH1gXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlXG59KVxuZXhwb3J0IGNsYXNzIFR3ZWV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBrZXlQdWJsaWM6IHN0cmluZztcbiAgQElucHV0KCkga2V5UHJpdmF0ZTogc3RyaW5nO1xuICBASW5wdXQoKSBoYXNoVGFnOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBlcnJvck1lc2FnZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBwcml2YXRlIF91bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+O1xuICB0d2VldHM6IFR3ZWV0c1tdO1xuICBmaWx0ZXJCeSA9ICdjcmVhdGVkX2F0JztcbiAgZmlsdGVyT3B0aW9ucyA9IFsnY3JlYXRlZF9hdCcsICd0ZXh0JywgJ3VzZXIubmFtZSddO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3QoKTtcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmFsRGF0YSgpKSB7XG4gICAgICB0aGlzLmdldFRva2VuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEVycm9yTWVzYWdlKCdObyBQdWJsaWMsIFByaXZpdGUgS2V5Jyk7XG4gICAgICB0aGlzLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICB9XG4gIHNldEZpbHRlckJ5KCkge1xuICAgIHJldHVybiB0aGlzLnR3ZWV0cy5zb3J0KChhLCBiKSA9PiBhW3RoaXMuZmlsdGVyQnldID4gYlt0aGlzLmZpbHRlckJ5XSA/IDEgOiBhW3RoaXMuZmlsdGVyQnldID09PSBiW3RoaXMuZmlsdGVyQnldID8gMCA6IC0xKTtcbiAgfVxuICBwcml2YXRlIGV2YWxEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmtleVB1YmxpYyAmJiB0aGlzLmtleVByaXZhdGVcbiAgICAgICYmIHRoaXMua2V5UHVibGljICE9PSBudWxsICYmIHRoaXMua2V5UHJpdmF0ZSAhPT0gbnVsbFxuICAgICAgJiYgdGhpcy5rZXlQdWJsaWMgIT09ICcnICYmIHRoaXMua2V5UHJpdmF0ZSAhPT0gJydcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZXZhSGFzaCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5oYXNoVGFnXG4gICAgICAmJiB0aGlzLmhhc2hUYWcgIT09IG51bGxcbiAgICAgICYmIHRoaXMuaGFzaFRhZyAhPT0gJydcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZXZhbFRva2VuICh0b2tlbjogVG9rZW4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdG9rZW4udG9rZW5fdHlwZSAmJiB0b2tlbi5hY2Nlc3NfdG9rZW5cbiAgICAgICYmIHRva2VuLnRva2VuX3R5cGUgIT09IG51bGwgJiYgdG9rZW4uYWNjZXNzX3Rva2VuICE9PSBudWxsXG4gICAgICAmJiB0b2tlbi50b2tlbl90eXBlICE9PSAnJyAmJiB0b2tlbi5hY2Nlc3NfdG9rZW4gIT09ICcnXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFRva2VuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV2YUhhc2goKSkge1xuICAgICAgY29uc3QgYmFzaWMgPSBidG9hKGAke3RoaXMua2V5UHVibGljfToke3RoaXMua2V5UHJpdmF0ZX1gKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAnQ29udGVudC1UeXBlJyAgOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nICAgOiBgQmFzaWMgICR7YmFzaWN9YFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBwYXlsb2FkLmFwcGVuZCgnZ3JhbnRfdHlwZScsICdjbGllbnRfY3JlZGVudGlhbHMnKTtcbiAgICAgIHRoaXMuaHR0cC5wb3N0PFRva2VuPihUd2VldENvbmZpZy50b2tlblVybCwgcGF5bG9hZCwgeyBoZWFkZXJzOiBoZWFkZXJzfSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlQWxsKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICB0b2tlbiA9PiB0aGlzLmdldFR3ZWV0TGlzdCh0b2tlbiksXG4gICAgICAgICAgZXJyb3IgPT4gdGhpcy5zZW5kRXJyb3JNZXNhZ2UoZXJyb3IpXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEVycm9yTWVzYWdlKCdObyBIYXNnVGFnIHNldCBGb3IgU2VhcmNoaW5nJyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0VHdlZXRMaXN0KHRva2VuOiBUb2tlbikge1xuICAgIGlmICh0aGlzLmV2YWxUb2tlbih0b2tlbikpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAnQXV0aG9yaXphdGlvbicgICA6IGAke3Rva2VuLnRva2VuX3R5cGV9ICR7dG9rZW4uYWNjZXNzX3Rva2VufWBcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ3EnLCBgJTIzJHt0aGlzLmhhc2hUYWd9YCk7XG4gICAgICB0aGlzLmh0dHAuZ2V0PGFueT4oVHdlZXRDb25maWcudHdlZXRTZWFyY2hVcmwsIHtoZWFkZXJzOiBoZWFkZXJzLCBwYXJhbXM6IHBhcmFtc30pXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZUFsbCkpXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKHtzdGF0dXNlc30pID0+IHRoaXMudHdlZXRzID0gPFR3ZWV0c1tdPnN0YXR1c2VzLFxuICAgICAgICAgIGVycm9yID0+IHRoaXMuc2VuZEVycm9yTWVzYWdlKGVycm9yKVxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRFcnJvck1lc2FnZSgnRXJyb3IgVHdlZXRlciBUb2tlbicpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNlbmRFcnJvck1lc2FnZShtZW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXJyb3JNZXNhZ2UuZW1pdChtZW4pO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlQWxsLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHdlZXRDb21wb25lbnQgfSBmcm9tICcuL3R3ZWV0LmNvbXBvbmVudCc7XG5pbXBvcnQge0Jyb3dzZXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtIdHRwQ2xpZW50TW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0Jyb3dzZXJBbmltYXRpb25zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtNYXRDYXJkTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbVHdlZXRDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQnJvd3Nlck1vZHVsZSxcbiAgICBIdHRwQ2xpZW50TW9kdWxlLFxuICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLFxuICAgIE1hdENhcmRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtUd2VldENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgVHdlZXRNb2R1bGUgeyB9XG4iXSwibmFtZXMiOlsiSW5qZWN0YWJsZSIsImh0dHAiLCJFdmVudEVtaXR0ZXIiLCJTdWJqZWN0IiwiSHR0cEhlYWRlcnMiLCJ0YWtlVW50aWwiLCJIdHRwUGFyYW1zIiwiQ29tcG9uZW50IiwiVmlld0VuY2Fwc3VsYXRpb24iLCJIdHRwQ2xpZW50IiwiSW5wdXQiLCJPdXRwdXQiLCJOZ01vZHVsZSIsIkJyb3dzZXJNb2R1bGUiLCJIdHRwQ2xpZW50TW9kdWxlIiwiQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUiLCJNYXRDYXJkTW9kdWxlIiwiTWF0U2VsZWN0TW9kdWxlIiwiRm9ybXNNb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtRQU9FO1NBQWlCOztvQkFMbEJBLGFBQVUsU0FBQzt3QkFDVixVQUFVLEVBQUUsTUFBTTtxQkFDbkI7Ozs7OzJCQUpEO0tBRUE7Ozs7OztBQ0ZBO1FBS00sV0FBVyxHQUFHO1FBQ2xCLFFBQVEsRUFBRSxzQ0FBc0M7UUFDaEQsY0FBYyxFQUFFLGdEQUFnRDtLQUNqRTs7UUFxRUMsd0JBQW9CQyxPQUFnQjtZQUFoQixTQUFJLEdBQUpBLE9BQUksQ0FBWTtZQU4xQixnQkFBVyxHQUFHLElBQUlDLGVBQVksRUFBVSxD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