UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

526 lines (525 loc) 79.7 kB
/* * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Filelink, ShapeType, VideoAccessMode, FitOptions, Align, ImageWatermarkPosition, SmartCropMode } from './filelink'; import { TransformSchema } from './../schema/transforms.schema'; import * as validator from '../schema/validator'; var defaultSource = '5aYkEQJSQCmYShsoCnZN'; var defaultApikey = 'DEFAULT_API_KEY'; describe('filelink', function () { beforeAll(function () { jest.spyOn(validator, 'getValidator').mockImplementation(); }); it('should properly instantiate Filelink', function () { var filelink = new Filelink(defaultSource); expect(filelink).toBeDefined(); expect(filelink).toBeInstanceOf(Filelink); }); it('should throw an error when handle is invalid', function () { var source = '*/5aYkEQJSQCmYShsoCnZN'; expect(function () { var f = new Filelink(source); }).toThrow('Invalid filestack source provided'); }); it('should support workflows source', function () { var source = 'wf://975092d5-2eb3-460e-aca8-e7b00a0838d5/2ec47319-24c8-4ced-9ae3-10a6d450a736/1c04a766e53633f1256759f2d06a50a3'; expect(function () { var f = new Filelink(source); }).not.toThrow(); }); it('should throw an error when external handle and without apikey', function () { var source = 'src://test123/example.jpg'; expect(function () { var filelink = new Filelink(source); }).toThrow('External sources requires apikey to handle transforms'); }); it('should throw an error when handle is invalid', function () { var source = '*/5aYkEQJSQCmYShsoCnZN'; expect(function () { var f = new Filelink(source); }).toThrow('Invalid filestack source provided'); }); it('should throw an error when external handle and without apikey', function () { var source = 'src://test123/example.jpg'; expect(function () { var filelink = new Filelink(source); }).toThrow('External sources requires apikey to handle transforms'); }); it('should be able to convert filelink to string', function () { var filelink = new Filelink(defaultSource); var result = filelink.toString(); expect(result).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); }); it('should allow to set validator status with toString method', function () { var filelink = new Filelink(defaultSource); filelink.setUseValidator(false); expect(filelink .resize({ // @ts-ignore t: 1, }) .toString()).toEqual('https://cdn.filestackcontent.com/resize=t:1/5aYkEQJSQCmYShsoCnZN'); }); it('should allow to set validator status with getTransformations method', function () { var filelink = new Filelink(defaultSource); filelink.setUseValidator(false); filelink.resize({ // @ts-ignore t: 1, }); expect(filelink.getTransformations()).toEqual([ { name: 'resize', params: { t: 1 }, }, ]); }); it('should create filelink with apikey when is provided', function () { var filelink = new Filelink(defaultSource, defaultApikey); var result = filelink.toString(); expect(result).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to use many tasks at once and reset them', function () { var filelink = new Filelink(defaultSource); var resizeParams = { width: 200, }; var rotateParams = { deg: 90, }; filelink .resize(resizeParams) .rotate(rotateParams) .crop({ dim: [20, 20, 250, 250], }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/resize=width:200/rotate=deg:90/crop=dim:[20,20,250,250]/5aYkEQJSQCmYShsoCnZN'); filelink.reset(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to get transformations', function () { var filelink = new Filelink(defaultSource); var resizeParams = { width: 200, }; var rotateParams = { deg: 90, }; filelink .resize(resizeParams) .rotate(rotateParams) .crop({ dim: [20, 20, 250, 250], }); var expected = [ { name: 'resize', params: { width: 200 } }, { name: 'rotate', params: { deg: 90 } }, { name: 'crop', params: { dim: [20, 20, 250, 250] } }, ]; expect(filelink.getTransformations()).toEqual(expected); }); it('should be able to getValidationSchema', function () { var filelink = new Filelink(defaultSource); var result = filelink.getValidationSchema(); expect(result).toEqual(TransformSchema); }); it('should not require apikay on filestack external url', function () { var filelink = new Filelink('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); filelink.shadow(false).upscale(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/upscale/"https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN"'); }); it('should be able to disable selected task', function () { var filelink = new Filelink(defaultSource); filelink.shadow(false).upscale(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/upscale/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to create filelink for many handles', function () { var sourceArr = ['5aYkEQJSQCmYShsoCnZN', '4aYkEQJSQCmYShsoCnZN']; var filelink = new Filelink(sourceArr); expect(filelink.toString()).toEqual('https://cdn.filestackcontent.com/[5aYkEQJSQCmYShsoCnZN,4aYkEQJSQCmYShsoCnZN]'); filelink.setBase64(true); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/b64://WzVhWWtFUUpTUUNtWVNoc29DblpOLDRhWWtFUUpTUUNtWVNoc29DblpOXQ=='); }); it('should be able to create filelink for many src handles', function () { var sourceArr = ['src://test123/example.jpg', 'src://test123/flug_9-trans_atlantik-400dpi.jpg']; var filelink = new Filelink(sourceArr, defaultApikey); expect(filelink.toString()).toEqual('https://cdn.filestackcontent.com/DEFAULT_API_KEY/["src://test123/example.jpg","src://test123/flug_9-trans_atlantik-400dpi.jpg"]'); }); it('should throw an error if task params are not valid', function () { var filelink = new Filelink(defaultSource); expect(function () { // @ts-ignore filelink.resize({ r: 2 }).toString(); }).toThrow('Params validation error'); }); it('should omit transformations with empty options', function () { var filelink = new Filelink(defaultSource); filelink.upscale(false); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); }); it('should throw an error if source does not exists', function () { expect(function () { return new Filelink(''); }).toThrow('Source not Set'); }); it('should be able to use custom cname', function () { var filelinkCname = new Filelink(defaultSource, defaultApikey); var cname = 'newcname.com'; filelinkCname.setCname(cname); expect(filelinkCname.toString()).toBe('https://cdn.newcname.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to use custom domain', function () { var filelinkCustomDomain = new Filelink(defaultSource, defaultApikey); var customDomain = 'https://customDomain.com'; filelinkCustomDomain.setCustomDomain(customDomain); expect(filelinkCustomDomain.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); }); }); describe('Different tasks', function () { var filelink; beforeEach(function () { filelink = new Filelink(defaultSource, defaultApikey); }); afterEach(function () { filelink = null; }); it('should be able to create filelink when handle is base64', function () { filelink.upscale(); filelink.setBase64(true); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/b64/W3sibmFtZSI6InVwc2NhbGUifV0=/b64://NWFZa0VRSlNRQ21ZU2hzb0NuWk4='); }); it('should be able to autoImage transformation', function () { filelink.autoImage(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/auto_image/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add flip', function () { filelink.flip(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/flip/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add flop', function () { filelink.flop(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/flop/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add imagesize', function () { filelink.imagesize(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/imagesize/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add no_metadata', function () { filelink.noMetadata(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/no_metadata/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add pjpg', function () { var params = { quality: 50, metadata: false, }; filelink.pjpg(params); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/pjpg=quality:50,metadata:false/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add smart_crop', function () { var params = { mode: SmartCropMode.auto, width: 1000, height: 1000, }; filelink.smartCrop(params); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/smart_crop=mode:auto,width:1000,height:1000/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add watermark', function () { var params = { file: 'http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg', size: 20, position: ImageWatermarkPosition.top, }; filelink.watermark(params); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/watermark=file:\"http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg\",size:20,position:top/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to enhance', function () { filelink.enhance(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/enhance/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to redeye', function () { filelink.redeye(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/redeye/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to monochrome', function () { filelink.monochrome(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/monochrome/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to negative', function () { filelink.negative(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/negative/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to process tags', function () { filelink.tags(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/tags/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to sfw', function () { filelink.sfw(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/sfw/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to store', function () { var storeParams = {}; filelink.store(storeParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/store/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to disable cache', function () { filelink.cache(false); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/cache=false/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to set cache params', function () { var cacheParams = { expiry: 666, }; filelink.cache(cacheParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/cache=expiry:666/5aYkEQJSQCmYShsoCnZN'); }); it('should be able add animation transform', function () { var params = { loop: 1, delay: 10, width: 10, height: 10, fit: FitOptions.scale, background: 'transparent', align: [Align.top, Align.center], }; filelink.animate(params); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/animate=loop:1,delay:10,width:10,height:10,fit:scale,background:transparent,align:[top,center]/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to resize', function () { var resizeParams = { width: 200, }; filelink.resize(resizeParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/resize=width:200/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to crop', function () { filelink.crop({ dim: [20, 20, 250, 250], }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/crop=dim:[20,20,250,250]/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to rotate', function () { var rotateParams = { deg: 90, }; filelink.rotate(rotateParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/rotate=deg:90/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to detect faces', function () { filelink.detectFaces({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/detect_faces/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to crop faces', function () { filelink.cropFaces({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/crop_faces/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to pixelate faces', function () { filelink.pixelateFaces({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/pixelate_faces/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to blur faces', function () { var blurFacesParams = { amount: 3, blur: 5, type: ShapeType.oval, }; filelink.blurFaces(blurFacesParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/blur_faces=amount:3,blur:5,type:oval/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to round cornerns', function () { var roundedCornersParams = { radius: 50, blur: 5, }; filelink.roundedCorners(roundedCornersParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/rounded_corners=radius:50,blur:5/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to polaroid', function () { var polaroidParams = { color: 'ff0000', rotate: 50, }; filelink.polaroid(polaroidParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/polaroid=color:ff0000,rotate:50/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to vignette', function () { var vignetteParams = { background: 'ff0000', amount: 5, }; filelink.vignette(vignetteParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/vignette=background:ff0000,amount:5/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to tornEdges', function () { filelink.tornEdges({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/torn_edges/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to shadow', function () { filelink.shadow(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/shadow/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to circle', function () { filelink.circle({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/circle/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to border', function () { filelink.border(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/border/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to vignette', function () { filelink.vignette({}); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/vignette/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to sharpen', function () { var sharpenParams = { amount: 5, }; filelink.sharpen(sharpenParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/sharpen=amount:5/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to blur', function () { var blurParams = { amount: 5, }; filelink.blur(blurParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/blur=amount:5/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to blackwhite', function () { var blackwhiteParams = { threshold: 50, }; filelink.blackwhite(blackwhiteParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/blackwhite=threshold:50/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to sepia', function () { filelink.sepia(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/sepia/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to pixelate', function () { filelink.pixelate(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/pixelate/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to oilPaint', function () { filelink.oilPaint(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/oil_paint/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to modulate', function () { filelink.modulate(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/modulate/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to partialPixelate', function () { filelink.partialPixelate({ objects: [[20, 20, 50, 50]], }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/partial_pixelate=objects:[[20,20,50,50]]/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to partialBlur', function () { filelink.partialBlur({ amount: 5, objects: [[20, 20, 50, 50]], }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/partial_blur=amount:5,objects:[[20,20,50,50]]/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to collage', function () { filelink.collage({ files: ['http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg'], width: 200, height: 200, }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/collage=files:["http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg"],width:200,height:200/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to upscale', function () { filelink.upscale(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/upscale/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to ascii', function () { filelink.ascii(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/ascii/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to quality', function () { var qualityParams = { value: 5, }; filelink.quality(qualityParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/quality=value:5/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to use security', function () { var securityParams = { policy: 'examplePolicy', signature: 'exampleSignature', }; filelink.security(securityParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/security=policy:examplePolicy,signature:exampleSignature/5aYkEQJSQCmYShsoCnZN'); }); it('should be able output', function () { var outputParams = { format: 'png', }; filelink.output(outputParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/output=format:png/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to videoConvert', function () { var videoConvertParams = { aspect_mode: VideoAccessMode.letterbox, upscale: true, }; filelink.videoConvert(videoConvertParams); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/video_convert=aspect_mode:letterbox,upscale:true/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to URLScreenshot', function () { filelink.URLScreenshot(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/urlscreenshot/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to PDFInfo', function () { filelink.PDFInfo(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/pdfinfo/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to PDFConvert', function () { filelink.PDFConvert(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/pdfconvert/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to force cache', function () { filelink.cache(true); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/cache/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add fallback transformation', function () { filelink.fallback({ handle: 'http:test.com', }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/fallback=handle:http:test.com/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add zip trnasformation', function () { filelink.zip(); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/zip/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add minify js transformation', function () { filelink.minifyJs({ mangle: true, gzip: true, }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/minify_js=mangle:true,gzip:true/5aYkEQJSQCmYShsoCnZN'); }); it('should be able to add minify css transformation', function () { filelink.minifyCss({ level: 1, gzip: true, }); expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/minify_css=level:1,gzip:true/5aYkEQJSQCmYShsoCnZN'); }); }); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZmlsZWxpbmsuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQW1CLFVBQVUsRUFBRSxLQUFLLEVBQW1CLHNCQUFzQixFQUFtQixhQUFhLEVBQXdCLE1BQU0sWUFBWSxDQUFDO0FBQ3JNLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBRWpELElBQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDO0FBQzdDLElBQU0sYUFBYSxHQUFHLGlCQUFpQixDQUFDO0FBRXhDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7SUFDbkIsU0FBUyxDQUFDO1FBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtRQUN6QyxJQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtRQUNqRCxJQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUN4QyxNQUFNLENBQUM7WUFDTCxJQUFNLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxp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Q0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUNoSCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtRQUNuRCxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxJQUFJO1lBQ1osSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHVHQUF1RyxDQUFDLENBQUM7SUFDNUksQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7UUFDcEQsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNqQixLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvR0FBb0csQ0FBQyxDQUFDO0lBQ3pJLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoibGliL2ZpbGVsaW5rLnNwZWMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVsaW5rLCBTaGFwZVR5cGUsIFZpZGVvQWNjZXNzTW9kZSwgQW5pbWF0aW9uUGFyYW1zLCBGaXRPcHRpb25zLCBBbGlnbiwgV2F0ZXJtYXJrUGFyYW1zLCBJbWFnZVdhdGVybWFya1Bvc2l0aW9uLCBTbWFydENyb3BQYXJhbXMsIFNtYXJ0Q3JvcE1vZGUsIFByb2dyZXNzaXZlSnBnUGFyYW1zIH0gZnJvbSAnLi9maWxlbGluayc7XG5pbXBvcnQgeyBUcmFuc2Zvcm1TY2hlbWEgfSBmcm9tICcuLy4uL3NjaGVtYS90cmFuc2Zvcm1zLnNjaGVtYSc7XG5pbXBvcnQgKiBhcyB2YWxpZGF0b3IgZnJvbSAnLi4vc2NoZW1hL3ZhbGlkYXRvcic7XG5cbmNvbnN0IGRlZmF1bHRTb3VyY2UgPSAnNWFZa0VRSlNRQ21ZU2hzb0NuWk4nO1xuY29uc3QgZGVmYXVsdEFwaWtleSA9ICdERUZBVUxUX0FQSV9LRVknO1xuXG5kZXNjcmliZSgnZmlsZWxpbmsnLCAoKSA9PiB7XG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgamVzdC5zcHlPbih2YWxpZGF0b3IsICdnZXRWYWxpZGF0b3InKS5tb2NrSW1wbGVtZW50YXRpb24oKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm9wZXJseSBpbnN0YW50aWF0ZSBGaWxlbGluaycsICgpID0+IHtcbiAgICB