@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
373 lines • 23.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @enum {number} */
const ToggleState = {
Init: 0,
Checked: 1,
Unchecked: 2,
};
export { ToggleState };
ToggleState[ToggleState.Init] = 'Init';
ToggleState[ToggleState.Checked] = 'Checked';
ToggleState[ToggleState.Unchecked] = 'Unchecked';
export class ToggleChange {
}
if (false) {
/** @type {?} */
ToggleChange.prototype.source;
/** @type {?} */
ToggleChange.prototype.checked;
}
// tslint:disable-next-line: component-class-suffix
export class Toggle {
/**
* Creates an instance of `Toggle`.
* @param {?} changeDetectorRef
*/
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
/**
* Set to `true` for toggle to be rendered without any classes on the host element.
*/
this.inline = false;
/**
* Set to `true` for a disabled toggle.
*/
this.disabled = false;
/**
* Set to `true` for a loading toggle.
*/
this.skeleton = false;
/**
* Set to `true` to hide the toggle labels.
*/
this.hideLabel = false;
/**
* The unique id for the toggle component.
*/
this.id = `toggle-${Toggle.toggleCount}`;
/**
* Used to set the `aria-label` attribute on the input element.
*/
// tslint:disable-next-line:no-input-rename
this.ariaLabel = '';
/**
* Horizontal distribution of elements
*/
this.distribution = 'equalSpacing';
/**
* Emits event notifying other classes when a change in state occurs on a toggle after a
* click.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Set to `true` if the input toggle is selected (or checked).
*/
// tslint:disable-next-line: variable-name
this._checked = false;
this.currentToggleState = ToggleState.Init;
/**
* Called when toggle is blurred. Needed to properly implement `ControlValueAccessor`.
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
/**
* Method set in `registerOnChange` to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
Toggle.toggleCount++;
}
/**
* Returns value `true` if state is selected for the toggle.
* @return {?}
*/
get checked() {
return this._checked;
}
/**
* Updating the state of a toggle to match the state of the parameter passed in.
* @param {?} checked
* @return {?}
*/
set checked(checked) {
if (checked !== this.checked) {
this._checked = checked;
this.changeDetectorRef.markForCheck();
}
}
/**
* @return {?}
*/
get toggleWrapperClass() {
return !this.inline;
}
/**
* @return {?}
*/
get formItemClass() {
return !this.inline;
}
/**
* Toggle the selected state of the toggle.
* @return {?}
*/
toggle() {
this.checked = !this.checked;
}
// this is the initial value set to the component
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.checked = !!value;
}
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the toggle is touched.
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Executes on the event of a change within `Toggle` to block propagation.
* @param {?} event
* @return {?}
*/
onChange(event) {
event.stopPropagation();
}
/**
* Handles click events on the `Toggle` and emits changes to other classes.
* @param {?} event
* @return {?}
*/
onClick(event) {
if (!this.disabled) {
this.toggle();
this.transitionToggleState(this._checked ? ToggleState.Checked : ToggleState.Unchecked);
this.emitChangeEvent();
}
}
/**
* Handles changes between toggle states.
* @param {?} newState
* @return {?}
*/
transitionToggleState(newState) {
/** @type {?} */
const oldState = this.currentToggleState;
if (oldState === newState) {
return;
}
this.currentToggleState = newState;
}
/**
* Creates instance of `ToggleChange` used to propagate the change event.
* @return {?}
*/
emitChangeEvent() {
/** @type {?} */
const event = new ToggleChange();
event.source = this;
event.checked = this.checked;
this.propagateChange(this.checked);
this.change.emit(event);
}
}
/**
* Variable used for creating unique ids for toggle components.
*/
Toggle.toggleCount = 0;
Toggle.decorators = [
{ type: Component, args: [{
selector: 'suka-toggle',
template: `
<label
class="
toggle
toggle--distribution-{{distribution}}
"
[ngClass]="{
'skeleton' : skeleton,
'disabled': disabled
}"
>
<ng-content></ng-content>
<input
type="checkbox"
[id]="id"
[value]="value"
[name]="name"
[required]="required"
[checked]="checked"
[disabled]="disabled"
[attr.aria-label]="ariaLabel"
[attr.aria-labelledby]="ariaLabelledby"
[attr.aria-checked]="checked"
(change)="onChange($event)"
(click)="onClick($event)"
/>
<span class="toggle-body">
<span class="toggle-switch"></span>
<span class="toggle-track">
<span class="toggle-bg"></span>
<span class="toggle-bg toggle-bg_negative"></span>
</span>
</span>
</label>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Toggle,
multi: true
}
],
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
Toggle.ctorParameters = () => [
{ type: ChangeDetectorRef }
];
Toggle.propDecorators = {
nested: [{ type: Input }],
inline: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
hideLabel: [{ type: Input }],
name: [{ type: Input }],
id: [{ type: Input }],
required: [{ type: Input }],
value: [{ type: Input }],
ariaLabel: [{ type: Input, args: ['aria-label',] }],
ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],
distribution: [{ type: Input }],
checked: [{ type: Input }],
toggleWrapperClass: [{ type: HostBinding, args: ['class.toggle-wrapper',] }],
formItemClass: [{ type: HostBinding, args: ['class.form-item',] }],
change: [{ type: Output }],
inputToggle: [{ type: ViewChild, args: ['inputToggle', { static: true },] }]
};
if (false) {
/**
* Variable used for creating unique ids for toggle components.
* @type {?}
*/
Toggle.toggleCount;
/**
* Set to `true` for toggle to be rendered with nested styles.
* @type {?}
*/
Toggle.prototype.nested;
/**
* Set to `true` for toggle to be rendered without any classes on the host element.
* @type {?}
*/
Toggle.prototype.inline;
/**
* Set to `true` for a disabled toggle.
* @type {?}
*/
Toggle.prototype.disabled;
/**
* Set to `true` for a loading toggle.
* @type {?}
*/
Toggle.prototype.skeleton;
/**
* Set to `true` to hide the toggle labels.
* @type {?}
*/
Toggle.prototype.hideLabel;
/**
* Sets the name attribute on the `input` element.
* @type {?}
*/
Toggle.prototype.name;
/**
* The unique id for the toggle component.
* @type {?}
*/
Toggle.prototype.id;
/**
* Reflects the required attribute of the `input` element.
* @type {?}
*/
Toggle.prototype.required;
/**
* Sets the value attribute on the `input` element.
* @type {?}
*/
Toggle.prototype.value;
/**
* Used to set the `aria-label` attribute on the input element.
* @type {?}
*/
Toggle.prototype.ariaLabel;
/**
* Used to set the `aria-labelledby` attribute on the input element.
* @type {?}
*/
Toggle.prototype.ariaLabelledby;
/**
* Horizontal distribution of elements
* @type {?}
*/
Toggle.prototype.distribution;
/**
* Emits event notifying other classes when a change in state occurs on a toggle after a
* click.
* @type {?}
*/
Toggle.prototype.change;
/**
* Set to `true` if the input toggle is selected (or checked).
* @type {?}
*/
Toggle.prototype._checked;
/** @type {?} */
Toggle.prototype.currentToggleState;
/**
* Maintains a reference to the view DOM element of the `Toggle`.
* @type {?}
*/
Toggle.prototype.inputToggle;
/**
* Called when toggle is blurred. Needed to properly implement `ControlValueAccessor`.
* @type {?}
*/
Toggle.prototype.onTouched;
/**
* Method set in `registerOnChange` to propagate changes back to the form.
* @type {?}
*/
Toggle.prototype.propagateChange;
/**
* @type {?}
* @protected
*/
Toggle.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi90b2dnbGUvdG9nZ2xlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0lBSXZFLE9BQUk7SUFDSixVQUFPO0lBQ1AsWUFBUzs7Ozs7O0FBR1gsTUFBTSxPQUFPLFlBQVk7Q0FHeEI7OztJQUZDLDhCQUFlOztJQUNmLCtCQUFpQjs7QUFrRG5CLG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sTUFBTTs7Ozs7SUEwR2pCLFlBQXNCLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COzs7O1FBN0ZqRCxXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFRbEIsT0FBRSxHQUFHLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7OztRQWF4QixjQUFTLEdBQUcsRUFBRSxDQUFDOzs7O1FBVzNCLGlCQUFZLEdBQXVELGNBQWMsQ0FBQzs7Ozs7O1FBK0JqRixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWdCLENBQUM7Ozs7O1FBTXBELGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsdUJBQWtCLEdBQWdCLFdBQVcsQ0FBQyxJQUFJLENBQUM7Ozs7UUErRG5ELGNBQVM7OztRQUFjLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQzs7OztRQThCakMs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QUs7d0JBSUwsS0FBSzttQkFJTCxLQUFLO2lCQUlMLEtBQUs7dUJBSUwsS0FBSztvQkFJTCxLQUFLO3dCQUtMLEtBQUssU0FBQyxZQUFZOzZCQUtsQixLQUFLLFNBQUMsaUJBQWlCOzJCQU12QixLQUFLO3NCQVlMLEtBQUs7aUNBT0wsV0FBVyxTQUFDLHNCQUFzQjs0QkFHbEMsV0FBVyxTQUFDLGlCQUFpQjtxQkFTN0IsTUFBTTswQkFhTixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7Ozs7OztJQWpHMUMsbUJBQXVCOzs7OztJQUt2Qix3QkFBeUI7Ozs7O0lBSXpCLHdCQUF3Qjs7Ozs7SUFJeEIsMEJBQTBCOzs7OztJQUkxQiwwQkFBMEI7Ozs7O0lBSTFCLDJCQUEyQjs7Ozs7SUFJM0Isc0JBQXNCOzs7OztJQUl0QixvQkFBNkM7Ozs7O0lBSTdDLDBCQUEyQjs7Ozs7SUFJM0IsdUJBQXVCOzs7OztJQUt2QiwyQkFBb0M7Ozs7O0lBS3BDLGdDQUFpRDs7Ozs7SUFNakQsOEJBQTJGOzs7Ozs7SUErQjNGLHdCQUFvRDs7Ozs7SUFNcEQsMEJBQWlCOztJQUVqQixvQ0FBbUQ7Ozs7O0lBS25ELDZCQUFvRTs7Ozs7SUEwRHBFLDJCQUFpQzs7Ozs7SUE4QmpDLGlDQUFrQzs7Ozs7SUFuRnRCLG1DQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cblxuZXhwb3J0IGVudW0gVG9nZ2xlU3RhdGUge1xuICBJbml0LFxuICBDaGVja2VkLFxuICBVbmNoZWNrZWRcbn1cblxuZXhwb3J0IGNsYXNzIFRvZ2dsZUNoYW5nZSB7XG4gIHNvdXJjZTogVG9nZ2xlO1xuICBjaGVja2VkOiBib29sZWFuO1xufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtdG9nZ2xlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHRvZ2dsZVxuICAgICAgICB0b2dnbGUtLWRpc3RyaWJ1dGlvbi17e2Rpc3RyaWJ1dGlvbn19XG4gICAgICBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2tlbGV0b24nIDogc2tlbGV0b24sXG4gICAgICAgICdkaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRieVwiXG4gICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJjaGVja2VkXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYm9keVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zd2l0Y2hcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRyYWNrXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYmdcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYmcgdG9nZ2xlLWJnX25lZ2F0aXZlXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogVG9nZ2xlLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgVG9nZ2xlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3IgdG9nZ2xlIGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgdG9nZ2xlQ291bnQgPSAwO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciB0b2dnbGUgdG8gYmUgcmVuZGVyZWQgd2l0aCBuZXN0ZWQgc3R5bGVzLlxuICAgKi9cbiAgQElucHV0KCkgbmVzdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgdG9nZ2xlIHRvIGJlIHJlbmRlcmVkIHdpdGhvdXQgYW55IGNsYXNzZXMgb24gdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZSA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBkaXNhYmxlZCB0b2dnbGUuXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIHRvZ2dsZS5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIHRvIGhpZGUgdGhlIHRvZ2dsZSBsYWJlbHMuXG4gICAqL1xuICBASW5wdXQoKSBoaWRlTGFiZWwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldHMgdGhlIG5hbWUgYXR0cmlidXRlIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkIGZvciB0aGUgdG9nZ2xlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYHRvZ2dsZS0ke1RvZ2dsZS50b2dnbGVDb3VudH1gO1xuICAvKipcbiAgICogUmVmbGVjdHMgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsID0gJyc7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cblxuICAvKipcbiAgICogIEhvcml6b250YWwgZGlzdHJpYnV0aW9uIG9mIGVsZW1lbnRzXG4gICAqL1xuICBASW5wdXQoKSBkaXN0cmlidXRpb246ICdsZWFkaW5nJyB8ICd0cmFpbGluZycgfCAnZXF1YWxTcGFjaW5nJyB8ICdjZW50ZXInID0gJ2VxdWFsU3BhY2luZyc7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdmFsdWUgYHRydWVgIGlmIHN0YXRlIGlzIHNlbGVjdGVkIGZvciB0aGUgdG9nZ2xlLlxuICAgKi9cbiAgZ2V0IGNoZWNrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRpbmcgdGhlIHN0YXRlIG9mIGEgdG9nZ2xlIHRvIG1hdGNoIHRoZSBzdGF0ZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbi5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjaGVja2VkKGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoY2hlY2tlZCAhPT0gdGhpcy5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9jaGVja2VkID0gY2hlY2tlZDtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy50b2dnbGUtd3JhcHBlcicpIGdldCB0b2dnbGVXcmFwcGVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuICF0aGlzLmlubGluZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGdldCBmb3JtSXRlbUNsYXNzKCkge1xuICAgIHJldHVybiAhdGhpcy5pbmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgZXZlbnQgbm90aWZ5aW5nIG90aGVyIGNsYXNzZXMgd2hlbiBhIGNoYW5nZSBpbiBzdGF0ZSBvY2N1cnMgb24gYSB0b2dnbGUgYWZ0ZXIgYVxuICAgKiBjbGljay5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUb2dnbGVDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIGlucHV0IHRvZ2dsZSBpcyBzZWxlY3RlZCAob3IgY2hlY2tlZCkuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbiAgX2NoZWNrZWQgPSBmYWxzZTtcblxuICBjdXJyZW50VG9nZ2xlU3RhdGU6IFRvZ2dsZVN0YXRlID0gVG9nZ2xlU3RhdGUuSW5pdDtcblxuICAvKipcbiAgICogTWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2aWV3IERPTSBlbGVtZW50IG9mIHRoZSBgVG9nZ2xlYC5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0VG9nZ2xlJywgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXRUb2dnbGU6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFRvZ2dsZWAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgVG9nZ2xlLnRvZ2dsZUNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHRoZSBzZWxlY3RlZCBzdGF0ZSBvZiB0aGUgdG9nZ2xlLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuICB9XG5cbiAgLy8gdGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgdG8gdGhlIGNvbXBvbmVudFxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY29udHJvbCBoYXMgYmVlbiB0b3VjaGVkLlxuICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvZ2dsZSBpcyB0b3VjaGVkLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIG9uIHRoZSBldmVudCBvZiBhIGNoYW5nZSB3aXRoaW4gYFRvZ2dsZWAgdG8gYmxvY2sgcHJvcGFnYXRpb24uXG4gICAqL1xuICBvbkNoYW5nZShldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBgVG9nZ2xlYCBhbmQgZW1pdHMgY2hhbmdlcyB0byBvdGhlciBjbGFzc2VzLlxuICAgKi9cbiAgb25DbGljayhldmVudCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvblRvZ2dsZVN0YXRlKHRoaXMuX2NoZWNrZWQgPyBUb2dnbGVTdGF0ZS5DaGVja2VkIDogVG9nZ2xlU3RhdGUuVW5jaGVja2VkKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdG9nZ2xlIGlzIGJsdXJyZWQuIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYC5cbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNoYW5nZXMgYmV0d2VlbiB0b2dnbGUgc3RhdGVzLlxuICAgKi9cbiAgdHJhbnNpdGlvblRvZ2dsZVN0YXRlKG5ld1N0YXRlOiBUb2dnbGVTdGF0ZSkge1xuICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5jdXJyZW50VG9nZ2xlU3RhdGU7XG5cbiAgICBpZiAob2xkU3RhdGUgPT09IG5ld1N0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VG9nZ2xlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGBUb2dnbGVDaGFuZ2VgIHVzZWQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBlbWl0Q2hhbmdlRXZlbnQoKSB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgVG9nZ2xlQ2hhbmdlKCk7XG4gICAgZXZlbnQuc291cmNlID0gdGhpcztcbiAgICBldmVudC5jaGVja2VkID0gdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5jaGVja2VkKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2Qgc2V0IGluIGByZWdpc3Rlck9uQ2hhbmdlYCB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xufVxuIl19