UNPKG

@esotericsoftware/spine-pixi-v8

Version:
112 lines 18.1 kB
/** **************************************************************************** * Spine Runtimes License Agreement * Last updated July 28, 2023. Replaces all prior versions. * * Copyright (c) 2013-2023, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software or * otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE * SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ import { checkExtension, copySearchParams, DOMAdapter, extensions, ExtensionType, LoaderParserPriority, path, Resolver, TextureSource } from 'pixi.js'; import { SpineTexture } from '../SpineTexture.js'; import { TextureAtlas } from '@esotericsoftware/spine-core'; const spineTextureAtlasLoader = { extension: ExtensionType.Asset, resolver: { test: (value) => checkExtension(value, ".atlas"), parse: (value) => { const split = value.split('.'); return { resolution: parseFloat(Resolver.RETINA_PREFIX?.exec(value)?.[1] ?? '1'), format: split[split.length - 2], src: value, }; }, }, loader: { extension: { type: ExtensionType.LoadParser, priority: LoaderParserPriority.Normal, name: 'spineTextureAtlasLoader', }, test(url) { return checkExtension(url, '.atlas'); }, async load(url) { const response = await DOMAdapter.get().fetch(url); const txt = await response.text(); return txt; }, testParse(asset, options) { const isExtensionRight = checkExtension(options.src, '.atlas'); const isString = typeof asset === 'string'; return Promise.resolve(isExtensionRight && isString); }, unload(atlas) { atlas.dispose(); }, async parse(asset, options, loader) { const metadata = options.data || {}; let basePath = path.dirname(options.src); if (basePath && basePath.lastIndexOf('/') !== basePath.length - 1) { basePath += '/'; } // Retval is going to be a texture atlas. However we need to wait for it's callback to resolve this promise. const retval = new TextureAtlas(asset); // If the user gave me only one texture, that one is assumed to be the "first" texture in the atlas if (metadata.images instanceof TextureSource || typeof metadata.images === 'string') { const pixiTexture = metadata.images; metadata.images = {}; metadata.images[retval.pages[0].name] = pixiTexture; } // we will wait for all promises for the textures at the same time at the end. const textureLoadingPromises = []; // fill the pages for (const page of retval.pages) { const pageName = page.name; const providedPage = metadata?.images ? metadata.images[pageName] : undefined; if (providedPage instanceof TextureSource) { page.setTexture(SpineTexture.from(providedPage)); } else { // eslint-disable-next-line max-len const url = providedPage ?? path.normalize([...basePath.split(path.sep), pageName].join(path.sep)); const assetsToLoadIn = { src: copySearchParams(url, options.src), data: { ...metadata.imageMetadata, alphaMode: page.pma ? 'premultiplied-alpha' : 'premultiply-alpha-on-upload' } }; const pixiPromise = loader.load(assetsToLoadIn).then((texture) => { page.setTexture(SpineTexture.from(texture.source)); }); textureLoadingPromises.push(pixiPromise); } } await Promise.all(textureLoadingPromises); return retval; }, }, }; extensions.add(spineTextureAtlasLoader); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXNMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL2F0bGFzTG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQ04sY0FBYyxFQUNkLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsVUFBVSxFQUNWLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLFFBQVEsRUFDUixhQUFhLEVBQ2IsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU01RCxNQUFNLHVCQUF1QixHQUFpRTtJQUM3RixTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUs7SUFFOUIsUUFBUSxFQUFFO1FBQ1QsSUFBSSxFQUFFLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUNqRSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQW1CLEVBQUU7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUUvQixPQUFPO2dCQUNOLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7Z0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsRUFBRSxLQUFLO2FBQ1YsQ0FBQztRQUNILENBQUM7S0FDRDtJQUVELE1BQU0sRUFBRTtRQUNQLFNBQVMsRUFBRTtZQUNWLElBQUksRUFBRSxhQUFhLENBQUMsVUFBVTtZQUM5QixRQUFRLEVBQUUs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QUFHO3dCQUN0QixHQUFHLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFhLENBQUM7d0JBQ2pELElBQUksRUFBRTs0QkFDTCxHQUFHLFFBQVEsQ0FBQyxhQUFhOzRCQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLDZCQUE2Qjt5QkFDM0U7cUJBQ0QsQ0FBQztvQkFFRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFVLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUN6RSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ3BELENBQUMsQ0FBQyxDQUFDO29CQUVILHNCQUFzQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNGLENBQUM7WUFFRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUUxQyxPQUFPLE1BQU0sQ0FBQztRQUNmLENBQUM7S0FDRDtDQUMrRCxDQUFDO0FBRWxFLFVBQVUsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEp1bHkgMjgsIDIwMjMuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMywgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvclxuICogb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRIRVxuICogU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7XG5cdGNoZWNrRXh0ZW5zaW9uLFxuXHRjb3B5U2VhcmNoUGFyYW1zLFxuXHRET01BZGFwdGVyLFxuXHRleHRlbnNpb25zLFxuXHRFeHRlbnNpb25UeXBlLFxuXHRMb2FkZXJQYXJzZXJQcmlvcml0eSxcblx0cGF0aCxcblx0UmVzb2x2ZXIsXG5cdFRleHR1cmVTb3VyY2Vcbn0gZnJvbSAncGl4aS5qcyc7XG5pbXBvcnQgeyBTcGluZVRleHR1cmUgfSBmcm9tICcuLi9TcGluZVRleHR1cmUuanMnO1xuaW1wb3J0IHsgVGV4dHVyZUF0bGFzIH0gZnJvbSAnQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgQXNzZXRFeHRlbnNpb24sIExvYWRlciwgUmVzb2x2ZWRBc3NldCwgVGV4dHVyZSwgVW5yZXNvbHZlZEFzc2V0IH0gZnJvbSAncGl4aS5qcyc7XG5cbnR5cGUgUmF3QXRsYXMgPSBzdHJpbmc7XG5cbmNvbnN0IHNwaW5lVGV4dHVyZUF0bGFzTG9hZGVyOiBBc3NldEV4dGVuc2lvbjxSYXdBdGxhcyB8IFRleHR1cmVBdGxhcywgSVNwaW5lQXRsYXNNZXRhZGF0YT4gPSB7XG5cdGV4dGVuc2lvbjogRXh0ZW5zaW9uVHlwZS5Bc3NldCxcblxuXHRyZXNvbHZlcjoge1xuXHRcdHRlc3Q6ICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiBjaGVja0V4dGVuc2lvbih2YWx1ZSwgXCIuYXRsYXNcIiksXG5cdFx0cGFyc2U6ICh2YWx1ZTogc3RyaW5nKTogVW5yZXNvbHZlZEFzc2V0ID0+IHtcblx0XHRcdGNvbnN0IHNwbGl0ID0gdmFsdWUuc3BsaXQoJy4nKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cmVzb2x1dGlvbjogcGFyc2VGbG9hdChSZXNvbHZlci5SRVRJTkFfUFJFRklYPy5leGVjKHZhbHVlKT8uWzFdID8/ICcxJyksXG5cdFx0XHRcdGZvcm1hdDogc3BsaXRbc3BsaXQubGVuZ3RoIC0gMl0sXG5cdFx0XHRcdHNyYzogdmFsdWUsXG5cdFx0XHR9O1xuXHRcdH0sXG5cdH0sXG5cblx0bG9hZGVyOiB7XG5cdFx0ZXh0ZW5zaW9uOiB7XG5cdFx0XHR0eXBlOiBFeHRlbnNpb25UeXBlLkxvYWRQYXJzZXIsXG5cdFx0XHRwcmlvcml0eTogTG9hZGVyUGFyc2VyUHJpb3JpdHkuTm9ybWFsLFxuXHRcdFx0bmFtZTogJ3NwaW5lVGV4dHVyZUF0bGFzTG9hZGVyJyxcblx0XHR9LFxuXG5cdFx0dGVzdCAodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRcdHJldHVybiBjaGVja0V4dGVuc2lvbih1cmwsICcuYXRsYXMnKTtcblx0XHR9LFxuXG5cdFx0YXN5bmMgbG9hZCAodXJsOiBzdHJpbmcpOiBQcm9taXNlPFJhd0F0bGFzPiB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IERPTUFkYXB0ZXIuZ2V0KCkuZmV0Y2godXJsKTtcblxuXHRcdFx0Y29uc3QgdHh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG5cdFx0XHRyZXR1cm4gdHh0O1xuXHRcdH0sXG5cblx0XHR0ZXN0UGFyc2UgKGFzc2V0OiB1bmtub3duLCBvcHRpb25zOiBSZXNvbHZlZEFzc2V0KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0XHRjb25zdCBpc0V4dGVuc2lvblJpZ2h0ID0gY2hlY2tFeHRlbnNpb24ob3B0aW9ucy5zcmMgYXMgc3RyaW5nLCAnLmF0bGFzJyk7XG5cdFx0XHRjb25zdCBpc1N0cmluZyA9IHR5cGVvZiBhc3NldCA9PT0gJ3N0cmluZyc7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoaXNFeHRlbnNpb25SaWdodCAmJiBpc1N0cmluZyk7XG5cdFx0fSxcblxuXHRcdHVubG9hZCAoYXRsYXM6IFRleHR1cmVBdGxhcykge1xuXHRcdFx0YXRsYXMuZGlzcG9zZSgpO1xuXHRcdH0sXG5cblx0XHRhc3luYyBwYXJzZSAoYXNzZXQ6IFJhd0F0bGFzLCBvcHRpb25zOiBSZXNvbHZlZEFzc2V0LCBsb2FkZXI6IExvYWRlcik6IFByb21pc2U8VGV4dHVyZUF0bGFzPiB7XG5cdFx0XHRjb25zdCBtZXRhZGF0YTogSVNwaW5lQXRsYXNNZXRhZGF0YSA9IG9wdGlvbnMuZGF0YSB8fCB7fTtcblx0XHRcdGxldCBiYXNlUGF0aCA9IHBhdGguZGlybmFtZShvcHRpb25zLnNyYyBhcyBzdHJpbmcpO1xuXG5cdFx0XHRpZiAoYmFzZVBhdGggJiYgYmFzZVBhdGgubGFzdEluZGV4T2YoJy8nKSAhPT0gYmFzZVBhdGgubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRiYXNlUGF0aCArPSAnLyc7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHZhbCBpcyBnb2luZyB0byBiZSBhIHRleHR1cmUgYXRsYXMuIEhvd2V2ZXIgd2UgbmVlZCB0byB3YWl0IGZvciBpdCdzIGNhbGxiYWNrIHRvIHJlc29sdmUgdGhpcyBwcm9taXNlLlxuXHRcdFx0Y29uc3QgcmV0dmFsID0gbmV3IFRleHR1cmVBdGxhcyhhc3NldCk7XG5cblx0XHRcdC8vIElmIHRoZSB1c2VyIGdhdmUgbWUgb25seSBvbmUgdGV4dHVyZSwgdGhhdCBvbmUgaXMgYXNzdW1lZCB0byBiZSB0aGUgXCJmaXJzdFwiIHRleHR1cmUgaW4gdGhlIGF0bGFzXG5cdFx0XHRpZiAobWV0YWRhdGEuaW1hZ2VzIGluc3RhbmNlb2YgVGV4dHVyZVNvdXJjZSB8fCB0eXBlb2YgbWV0YWRhdGEuaW1hZ2VzID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRjb25zdCBwaXhpVGV4dHVyZSA9IG1ldGFkYXRhLmltYWdlcztcblxuXHRcdFx0XHRtZXRhZGF0YS5pbWFnZXMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBUZXh0dXJlU291cmNlIHwgc3RyaW5nPjtcblx0XHRcdFx0bWV0YWRhdGEuaW1hZ2VzW3JldHZhbC5wYWdlc1swXS5uYW1lXSA9IHBpeGlUZXh0dXJlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSB3aWxsIHdhaXQgZm9yIGFsbCBwcm9taXNlcyBmb3IgdGhlIHRleHR1cmVzIGF0IHRoZSBzYW1lIHRpbWUgYXQgdGhlIGVuZC5cblx0XHRcdGNvbnN0IHRleHR1cmVMb2FkaW5nUHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XG5cblx0XHRcdC8vIGZpbGwgdGhlIHBhZ2VzXG5cdFx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcmV0dmFsLnBhZ2VzKSB7XG5cdFx0XHRcdGNvbnN0IHBhZ2VOYW1lID0gcGFnZS5uYW1lO1xuXHRcdFx0XHRjb25zdCBwcm92aWRlZFBhZ2UgPSBtZXRhZGF0YT8uaW1hZ2VzID8gbWV0YWRhdGEuaW1hZ2VzW3BhZ2VOYW1lXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRpZiAocHJvdmlkZWRQYWdlIGluc3RhbmNlb2YgVGV4dHVyZVNvdXJjZSkge1xuXHRcdFx0XHRcdHBhZ2Uuc2V0VGV4dHVyZShTcGluZVRleHR1cmUuZnJvbShwcm92aWRlZFBhZ2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuXHRcdFx0XHRcdGNvbnN0IHVybDogc3RyaW5nID0gcHJvdmlkZWRQYWdlID8/IHBhdGgubm9ybWFsaXplKFsuLi5iYXNlUGF0aC5zcGxpdChwYXRoLnNlcCksIHBhZ2VOYW1lXS5qb2luKHBhdGguc2VwKSk7XG5cblx0XHRcdFx0XHRjb25zdCBhc3NldHNUb0xvYWRJbiA9IHtcblx0XHRcdFx0XHRcdHNyYzogY29weVNlYXJjaFBhcmFtcyh1cmwsIG9wdGlvbnMuc3JjIGFzIHN0cmluZyksXG5cdFx0XHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0XHRcdC4uLm1ldGFkYXRhLmltYWdlTWV0YWRhdGEsXG5cdFx0XHRcdFx0XHRcdGFscGhhTW9kZTogcGFnZS5wbWEgPyAncHJlbXVsdGlwbGllZC1hbHBoYScgOiAncHJlbXVsdGlwbHktYWxwaGEtb24tdXBsb2FkJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRjb25zdCBwaXhpUHJvbWlzZSA9IGxvYWRlci5sb2FkPFRleHR1cmU+KGFzc2V0c1RvTG9hZEluKS50aGVuKCh0ZXh0dXJlKSA9PiB7XG5cdFx0XHRcdFx0XHRwYWdlLnNldFRleHR1cmUoU3BpbmVUZXh0dXJlLmZyb20odGV4dHVyZS5zb3VyY2UpKTtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkaW5nUHJvbWlzZXMucHVzaChwaXhpUHJvbWlzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodGV4dHVyZUxvYWRpbmdQcm9taXNlcyk7XG5cblx0XHRcdHJldHVybiByZXR2YWw7XG5cdFx0fSxcblx0fSxcbn0gYXMgQXNzZXRFeHRlbnNpb248UmF3QXRsYXMgfCBUZXh0dXJlQXRsYXMsIElTcGluZUF0bGFzTWV0YWRhdGE+O1xuXG5leHRlbnNpb25zLmFkZChzcGluZVRleHR1cmVBdGxhc0xvYWRlcik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNwaW5lQXRsYXNNZXRhZGF0YSB7XG5cdC8vIElmIHlvdSBhcmUgZG93bmxvYWRpbmcgYW4gLmF0bGFzIGZpbGUsIHRoaXMgbWV0YWRhdGEgd2lsbCBnbyB0byB0aGUgVGV4dHVyZSBsb2FkZXJcblx0aW1hZ2VNZXRhZGF0YT86IGFueTtcblx0Ly8gSWYgeW91IGFscmVhZHkgaGF2ZSBhdGxhcyBwYWdlcyBsb2FkZWQgYXMgcGl4aSB0ZXh0dXJlc1xuXHQvLyBhbmQgd2FudCB0byB1c2UgdGhhdCB0byBjcmVhdGUgdGhlIGF0bGFzLCB5b3UgY2FuIHBhc3MgdGhlbSBoZXJlXG5cdGltYWdlcz86IFRleHR1cmVTb3VyY2UgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBUZXh0dXJlU291cmNlIHwgc3RyaW5nPjtcbn1cbiJdfQ==