@realsee/dnalogel 3.69.3 → 3.69.4-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/components/index.js +1202 -575
- package/dist/floorplan/FloorplanGuidePlugin/Components/Camera.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/Main.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/ObserverDots.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Components/RoomLabels.svelte.d.ts +1 -0
- package/dist/floorplan/FloorplanGuidePlugin/Controller.d.ts +46 -0
- package/dist/floorplan/FloorplanGuidePlugin/index.d.ts +7 -0
- package/dist/floorplan/FloorplanGuidePlugin/typing.d.ts +146 -0
- package/dist/floorplan/index.d.ts +1 -0
- package/dist/index.cjs.js +81 -81
- package/dist/index.js +13173 -11276
- package/dist/index.umd.js +78 -78
- package/docs/assets/navigation.js +1 -1
- package/docs/assets/search.js +1 -1
- package/docs/classes/AreaMakerPluginType.AreaMakerController.html +2 -2
- package/docs/classes/AreaMakerPluginType.AreaMakerItem.html +2 -2
- package/docs/classes/CSS3DRender.html +2 -2
- package/docs/classes/GuideLineItem.GuideLineItem.html +2 -2
- package/docs/classes/GuideLineModeItem.GuideLineModeItem.html +2 -2
- package/docs/classes/ModelMakerPluginInstance.html +2 -2
- package/docs/classes/ModelMakerPluginType.ModelMakerBoxItem.html +2 -2
- package/docs/classes/ModelMakerPluginType.ModelMakerPolygonItem.html +2 -2
- package/docs/classes/ModelMakerPluginType.ModelMakerPrismItem.html +2 -2
- package/docs/classes/ModelRoomLabelController.html +2 -2
- package/docs/classes/MoveController.html +2 -2
- package/docs/classes/Object3DHelperController.html +2 -2
- package/docs/classes/PaintBrush.html +2 -2
- package/docs/classes/PanoMeasurePluginLine.html +2 -2
- package/docs/classes/PanoMeasurePluginModel.html +2 -2
- package/docs/classes/PanoMeasurePluginPoint.html +2 -2
- package/docs/classes/PanoMeasurePluginPolyline.html +2 -2
- package/docs/classes/PanoTagPluginController.html +2 -2
- package/docs/classes/Sculpt.html +2 -2
- package/docs/classes/Util.BetterTween.html +2 -2
- package/docs/classes/Util.FiveDomEvents.html +2 -2
- package/docs/classes/Util.FivePuppet.html +2 -2
- package/docs/classes/Util.Interval.html +2 -2
- package/docs/classes/Util.LegacyPointHelper.html +2 -2
- package/docs/classes/Util.LightTag.html +2 -2
- package/docs/classes/Util.LineSegments.html +2 -2
- package/docs/classes/Util.Magnifier.html +2 -2
- package/docs/classes/Util.Object3D.html +2 -2
- package/docs/classes/Util.PointDomHelper.html +2 -2
- package/docs/classes/Util.PointHelper.html +2 -2
- package/docs/classes/Util.PointSelector.html +2 -2
- package/docs/classes/Util.PointSelectorHelper.html +2 -2
- package/docs/classes/Util.Rectangle.html +2 -2
- package/docs/classes/Util.sculpt.BaseEditor.html +2 -2
- package/docs/classes/Util.sculpt.BoxMesh.html +2 -2
- package/docs/classes/Util.sculpt.BoxMeshEditor.html +2 -2
- package/docs/classes/Util.sculpt.CircleMesh.html +2 -2
- package/docs/classes/Util.sculpt.CircleMeshEditor.html +2 -2
- package/docs/classes/Util.sculpt.CircleWithEdgeMesh.html +2 -2
- package/docs/classes/Util.sculpt.CylinderMesh.html +2 -2
- package/docs/classes/Util.sculpt.CylinderMeshEditor.html +2 -2
- package/docs/classes/Util.sculpt.LineMesh.html +2 -2
- package/docs/classes/Util.sculpt.PointMesh.html +2 -2
- package/docs/classes/Util.sculpt.PolygonMesh.html +2 -2
- package/docs/classes/Util.sculpt.PrismMesh.html +2 -2
- package/docs/classes/Util.sculpt.PrismMeshEditor.html +2 -2
- package/docs/classes/Util.sculpt.RectangleMesh.html +2 -2
- package/docs/classes/Util.sculpt.RectangleMeshEditor.html +2 -2
- package/docs/classes/Util.sculpt.RectangleWithEdgeMesh.html +2 -2
- package/docs/classes/WalkController.html +2 -2
- package/docs/enums/CameraMovementEffect.html +2 -2
- package/docs/enums/ContentType.html +2 -2
- package/docs/enums/DIRECTION.html +2 -2
- package/docs/enums/DISPLAY_STRATEGY_TYPE.html +2 -2
- package/docs/enums/DimensionType.html +2 -2
- package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +2 -2
- package/docs/enums/ITEM_LABEL_PLUGIN_DISPLAY_STRATEGY_TYPE.html +2 -2
- package/docs/enums/PaintBrushTypeEnum.html +2 -2
- package/docs/enums/PointType.html +2 -2
- package/docs/enums/Rotation.html +2 -2
- package/docs/functions/AreaMakerPlugin.html +1 -1
- package/docs/functions/CSS3DRenderPlugin.html +1 -1
- package/docs/functions/CameraMovementPlugin.html +2 -2
- package/docs/functions/CruisePlugin.html +1 -1
- package/docs/functions/CurrentPanoImagePlugin.html +1 -1
- package/docs/functions/FloorplanGuidePlugin.html +1 -0
- package/docs/functions/GuideLinePlugin.html +1 -1
- package/docs/functions/ItemLabelPlugin.html +1 -1
- package/docs/functions/MapviewFloorplanPlugin.html +1 -1
- package/docs/functions/MeasurePlugin.html +1 -1
- package/docs/functions/ModelChassisCompassPlugin.html +2 -2
- package/docs/functions/ModelEntryDoorGuidePlugin.html +2 -2
- package/docs/functions/ModelFloorplanPlugin.html +1 -1
- package/docs/functions/ModelItemLabelPlugin.html +1 -1
- package/docs/functions/ModelMakerPlugin.html +1 -1
- package/docs/functions/ModelRoomLabelPlugin.html +1 -1
- package/docs/functions/ModelTVVideoPlugin.html +1 -1
- package/docs/functions/ModelViewPlugin.html +2 -2
- package/docs/functions/MovePlugin.html +1 -1
- package/docs/functions/Object3DHelperPlugin.html +1 -1
- package/docs/functions/PanoCompassPlugin.html +1 -1
- package/docs/functions/PanoCursorRaycasterPlugin.html +2 -2
- package/docs/functions/PanoDoorLabelPlugin.html +1 -1
- package/docs/functions/PanoFloorplanRadarPlugin.html +1 -1
- package/docs/functions/PanoMeasurePlugin.html +1 -1
- package/docs/functions/PanoRulerPlugin.html +2 -2
- package/docs/functions/PanoRulerProPlugin.html +2 -2
- package/docs/functions/PanoSpatialTagPlugin.html +2 -2
- package/docs/functions/PanoTagPlugin.html +1 -1
- package/docs/functions/PanoVideoPlugin.html +2 -2
- package/docs/functions/PipelinePlugin.html +1 -1
- package/docs/functions/SculptPlugin.html +2 -2
- package/docs/functions/SculptPluginForFive.html +2 -2
- package/docs/functions/TopviewFloorplanPlugin.html +1 -1
- package/docs/functions/Util.awaitNextFrame.html +1 -1
- package/docs/functions/Util.blink.html +2 -2
- package/docs/functions/Util.bounding.html +1 -1
- package/docs/functions/Util.boundingBox.html +1 -1
- package/docs/functions/Util.boundingSphere.html +1 -1
- package/docs/functions/Util.boxVertex.html +2 -2
- package/docs/functions/Util.boxVertexes.html +1 -1
- package/docs/functions/Util.checkFiveModelLoaded.html +2 -2
- package/docs/functions/Util.convexHull.html +2 -2
- package/docs/functions/Util.equal.html +2 -2
- package/docs/functions/Util.fiveModelIsLoaded.html +2 -2
- package/docs/functions/Util.getCoordsFromClient.html +1 -1
- package/docs/functions/Util.getCoordsFromElement.html +1 -1
- package/docs/functions/Util.getFrameTime.html +2 -2
- package/docs/functions/Util.getIntersectFromRelativePosition.html +1 -1
- package/docs/functions/Util.getRaycasterFromFivePointer.html +1 -1
- package/docs/functions/Util.initialCSS3DRender.html +1 -1
- package/docs/functions/Util.inside.html +1 -1
- package/docs/functions/Util.isModelLike.html +1 -1
- package/docs/functions/Util.isNil.html +2 -2
- package/docs/functions/Util.isPanoramaLike.html +1 -1
- package/docs/functions/Util.lookObject.html +2 -2
- package/docs/functions/Util.lookPoint.html +2 -2
- package/docs/functions/Util.nextFrame.html +1 -1
- package/docs/functions/Util.notNil.html +2 -2
- package/docs/functions/Util.reblink.html +2 -2
- package/docs/functions/Util.replaceStaticPrefix.html +2 -2
- package/docs/functions/Util.requestAnimationFrameInterval.html +2 -2
- package/docs/functions/Util.sculpt.createBox.html +1 -1
- package/docs/functions/Util.sculpt.createCircle.html +1 -1
- package/docs/functions/Util.sculpt.createCylinder.html +1 -1
- package/docs/functions/Util.sculpt.createLine.html +2 -2
- package/docs/functions/Util.sculpt.createPoint.html +1 -1
- package/docs/functions/Util.sculpt.createPolygon.html +1 -1
- package/docs/functions/Util.sculpt.createPrism.html +1 -1
- package/docs/functions/Util.sculpt.createRectangle.html +2 -2
- package/docs/functions/Util.tag.html +1 -1
- package/docs/functions/Util.tweenProgress.html +1 -1
- package/docs/functions/Util.uuid.html +2 -2
- package/docs/functions/Util.waitFiveModelLoaded.html +2 -2
- package/docs/functions/Util.worldBounding.html +1 -1
- package/docs/functions/Util.worldBoundingBox.html +1 -1
- package/docs/functions/Util.worldBoundingSphere.html +1 -1
- package/docs/functions/createPolyline.html +2 -2
- package/docs/functions/pluginFlag.html +1 -1
- package/docs/hierarchy.html +1 -1
- package/docs/index.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.AnimeOptions.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.Config.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.EventMap.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.Params.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItem.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.ServerAreaMakerItemV1.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.ServerDataV1.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.ServerDataV2.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.ShowHideOptions.html +2 -2
- package/docs/interfaces/AreaMakerPluginType.State.html +2 -2
- package/docs/interfaces/CSS3DRenderPluginEventMap.html +2 -2
- package/docs/interfaces/CSS3DRenderPluginState.html +2 -2
- package/docs/interfaces/CameraMovementPluginExportType.html +2 -2
- package/docs/interfaces/ContentTypeMapInterface.html +2 -2
- package/docs/interfaces/CruisePluginTypes.Config.html +2 -2
- package/docs/interfaces/CruisePluginTypes.CruiseKeyframe.html +2 -2
- package/docs/interfaces/CruisePluginTypes.EventMap.html +2 -2
- package/docs/interfaces/CruisePluginTypes.GuildLineConfig.html +2 -2
- package/docs/interfaces/CruisePluginTypes.MoveAction.html +2 -2
- package/docs/interfaces/CruisePluginTypes.MoveWithKeyframesAction.html +2 -2
- package/docs/interfaces/CruisePluginTypes.MoveWithPanoIndexAction.html +2 -2
- package/docs/interfaces/CruisePluginTypes.PluginData.html +2 -2
- package/docs/interfaces/CruisePluginTypes.PluginServerData.html +2 -2
- package/docs/interfaces/CruisePluginTypes.PluginState.html +2 -2
- package/docs/interfaces/CurrentPanoImagePluginType.Config.html +2 -2
- package/docs/interfaces/CurrentPanoImagePluginType.EventMap.html +2 -2
- package/docs/interfaces/CurrentPanoImagePluginType.Params.html +2 -2
- package/docs/interfaces/CurrentPanoImagePluginType.ShowHideOptions.html +2 -2
- package/docs/interfaces/CurrentPanoImagePluginType.State.html +2 -2
- package/docs/interfaces/FloorplanBounding.html +2 -2
- package/docs/interfaces/FloorplanData.html +2 -2
- package/docs/interfaces/FloorplanEntrance.html +2 -2
- package/docs/interfaces/FloorplanExtraObject.html +2 -2
- package/docs/interfaces/FloorplanExtraObject3D.html +2 -2
- package/docs/interfaces/FloorplanFloorData.html +2 -2
- package/docs/interfaces/FloorplanImagePosition.html +2 -2
- package/docs/interfaces/FloorplanObserver.html +2 -2
- package/docs/interfaces/FloorplanOutlineItem.html +2 -2
- package/docs/interfaces/FloorplanPosition.html +2 -2
- package/docs/interfaces/FloorplanRoomItem.html +2 -2
- package/docs/interfaces/FloorplanRoomLabelItem.html +2 -2
- package/docs/interfaces/FloorplanServerBounding.html +2 -2
- package/docs/interfaces/FloorplanServerComputedData.html +2 -2
- package/docs/interfaces/FloorplanServerData.html +2 -2
- package/docs/interfaces/FloorplanServerDoorItem.html +2 -2
- package/docs/interfaces/FloorplanServerDoorPosition.html +2 -2
- package/docs/interfaces/FloorplanServerEntrance.html +2 -2
- package/docs/interfaces/FloorplanServerFloorData.html +2 -2
- package/docs/interfaces/FloorplanServerImagePosition.html +2 -2
- package/docs/interfaces/FloorplanServerObserver.html +2 -2
- package/docs/interfaces/FloorplanServerOutlineItem.html +2 -2
- package/docs/interfaces/FloorplanServerPosition.html +2 -2
- package/docs/interfaces/FloorplanServerRoomItem.html +2 -2
- package/docs/interfaces/FloorplanServerRoomLabelItem.html +2 -2
- package/docs/interfaces/GuideLineModeItem.GuideLineTagContainer.html +2 -2
- package/docs/interfaces/GuideLinePluginType.CatmullRomCurve3.html +2 -2
- package/docs/interfaces/GuideLinePluginType.EventMap.html +2 -2
- package/docs/interfaces/GuideLinePluginType.ExtraRouteData.html +2 -2
- package/docs/interfaces/GuideLinePluginType.GuideLineGeometryStyle.html +2 -2
- package/docs/interfaces/GuideLinePluginType.GuideLineItemContainer.html +2 -2
- package/docs/interfaces/GuideLinePluginType.GuideLineMaterialStyle.html +2 -2
- package/docs/interfaces/GuideLinePluginType.GuideLineMeshStyle.html +2 -2
- package/docs/interfaces/GuideLinePluginType.LineGeometriesConfig.html +2 -2
- package/docs/interfaces/GuideLinePluginType.ModelGuideLineStyle.html +2 -2
- package/docs/interfaces/GuideLinePluginType.ModelGuideLineTagData.html +2 -2
- package/docs/interfaces/GuideLinePluginType.PanoramaGuideLineStyle.html +2 -2
- package/docs/interfaces/GuideLinePluginType.PluginDataV2.html +1 -1
- package/docs/interfaces/GuideLinePluginType.PluginServerData.html +2 -2
- package/docs/interfaces/GuideLinePluginType.PluginState.html +2 -2
- package/docs/interfaces/GuideLinePluginType.Route.html +2 -2
- package/docs/interfaces/HelperOffset.html +2 -2
- package/docs/interfaces/ImagePlaneGroup.html +2 -2
- package/docs/interfaces/ItemLabelPluginData.html +2 -2
- package/docs/interfaces/ItemLabelPluginExportReturnsType.html +2 -2
- package/docs/interfaces/ItemLabelPluginParametersType.html +2 -2
- package/docs/interfaces/MinMax.html +2 -2
- package/docs/interfaces/ModelChassisCompassPluginData.html +2 -2
- package/docs/interfaces/ModelChassisCompassPluginExportType.html +2 -2
- package/docs/interfaces/ModelChassisCompassPluginParameterType.html +2 -2
- package/docs/interfaces/ModelEntryDoorGuidePluginData.html +2 -2
- package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +2 -2
- package/docs/interfaces/ModelItemLabelPluginData.html +2 -2
- package/docs/interfaces/ModelItemLabelPluginExportReturnsType.html +2 -2
- package/docs/interfaces/ModelItemLabelPluginParametersType.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.BoxItemObjectData.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.EventMap.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.PrismItemObjectData.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.ServerBaseItem.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.ServerBoxItem.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.ServerData.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.ServerPrismItem.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.ServerTrianglesItem.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.State.html +2 -2
- package/docs/interfaces/ModelMakerPluginType.TrianglesItemObjectData.html +2 -2
- package/docs/interfaces/ModelRoomLabelPluginData.html +2 -2
- package/docs/interfaces/ModelTVVideoPluginData.html +2 -2
- package/docs/interfaces/ModelTVVideoPluginExportType.html +2 -2
- package/docs/interfaces/ModelTVVideoPluginParameterType.html +2 -2
- package/docs/interfaces/ModelViewPluginExportType.html +2 -2
- package/docs/interfaces/Object3DHelperState.html +2 -2
- package/docs/interfaces/ObjectHelperControllers.html +2 -2
- package/docs/interfaces/PaintBrushAction.html +2 -2
- package/docs/interfaces/PaintBrushConfigs.html +2 -2
- package/docs/interfaces/PaintBrushState.html +2 -2
- package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +2 -2
- package/docs/interfaces/PanoCursorRaycasterPluginParameterType.html +1 -1
- package/docs/interfaces/PanoMeasureParameterType.html +2 -2
- package/docs/interfaces/PanoMeasurePluginLineJson.html +2 -2
- package/docs/interfaces/PanoMeasurePluginOpenParameter.html +2 -2
- package/docs/interfaces/PanoMeasurePluginPointJson.html +2 -2
- package/docs/interfaces/PanoMeasurePluginPolylineJson.html +2 -2
- package/docs/interfaces/PanoRulerPluginExportType.html +2 -2
- package/docs/interfaces/PanoRulerPluginOptions.html +2 -2
- package/docs/interfaces/PanoRulerPluginParameterType.html +2 -2
- package/docs/interfaces/PanoRulerProPluginExportType.html +2 -2
- package/docs/interfaces/PanoRulerProPluginOptions.html +2 -2
- package/docs/interfaces/PanoRulerProPluginParameterType.html +2 -2
- package/docs/interfaces/PanoRulerProPluginState.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginContentEvent.html +1 -1
- package/docs/interfaces/PanoSpatialTagPluginContentReplacement.html +1 -1
- package/docs/interfaces/PanoSpatialTagPluginData.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginDataElement.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginExportType.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginOriginElement.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginParameterType.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginPointElement.html +2 -2
- package/docs/interfaces/PanoSpatialTagPluginTagElement.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.LoadParams.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.PanoVideoItem.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.PluginData.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.PluginEventMap.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.PluginState.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.VideoItem.html +2 -2
- package/docs/interfaces/PanoVideoPluginType.VideoMeshParams.html +2 -2
- package/docs/interfaces/PluginEventMap.html +2 -2
- package/docs/interfaces/Point.html +2 -2
- package/docs/interfaces/Room.html +2 -2
- package/docs/interfaces/RoomInfo.html +2 -2
- package/docs/interfaces/RoomLabel.html +2 -2
- package/docs/interfaces/RoomRules.html +1 -1
- package/docs/interfaces/Rooms.html +1 -1
- package/docs/interfaces/Scissor.html +2 -2
- package/docs/interfaces/SculptConfig.html +2 -2
- package/docs/interfaces/State.html +2 -2
- package/docs/interfaces/TagCacheInterface.html +2 -2
- package/docs/interfaces/TagConfig.html +2 -2
- package/docs/interfaces/TagGLTFObjectGroup.html +2 -2
- package/docs/interfaces/TagIconUrl.html +2 -2
- package/docs/interfaces/TagObjectGroup.html +2 -2
- package/docs/interfaces/TagState.html +2 -2
- package/docs/interfaces/TagStyle.html +2 -2
- package/docs/interfaces/Tags.html +2 -2
- package/docs/interfaces/TemporaryState.html +2 -2
- package/docs/interfaces/Util.AnimeInstance.html +2 -2
- package/docs/interfaces/Util.BlinkAnimeOptions.html +2 -2
- package/docs/interfaces/Util.EventHandlerConfig.html +2 -2
- package/docs/interfaces/Util.FiveDomEvent.html +2 -2
- package/docs/interfaces/Util.FiveDomEventMap.html +2 -2
- package/docs/interfaces/Util.LegacyMouseGroupParameter.html +2 -2
- package/docs/interfaces/Util.MagnifierParameter.html +2 -2
- package/docs/interfaces/Util.MouseGroupParameter.html +2 -2
- package/docs/interfaces/Util.PointIntersection.html +2 -2
- package/docs/interfaces/Util.PointSelectorHelperConfig.html +2 -2
- package/docs/interfaces/Util.ReBlinkAnimeOptions.html +2 -2
- package/docs/modules/AreaMakerPluginType.html +2 -2
- package/docs/modules/CruisePluginTypes.html +2 -2
- package/docs/modules/CurrentPanoImagePluginType.html +2 -2
- package/docs/modules/GuideLineItem.html +2 -2
- package/docs/modules/GuideLineModeItem.html +2 -2
- package/docs/modules/GuideLinePluginType.html +2 -2
- package/docs/modules/ModelMakerPluginType.html +2 -2
- package/docs/modules/PanoVideoPluginType.html +2 -2
- package/docs/modules/SculptData.html +2 -2
- package/docs/modules/SculptType.html +2 -2
- package/docs/modules/Util.html +2 -2
- package/docs/modules/Util.sculpt.html +2 -2
- package/docs/modules.html +5 -2
- package/docs/types/AddObject3DHelperConfig.html +2 -2
- package/docs/types/AreaMakerPluginType.AreaMakerItemEventMap.html +2 -2
- package/docs/types/AreaMakerPluginType.ItemRenderer.html +1 -1
- package/docs/types/AreaMakerPluginType.PluginData.html +2 -2
- package/docs/types/AreaMakerPluginType.ServerData.html +2 -2
- package/docs/types/ArrayPosition.html +1 -1
- package/docs/types/AudioAppearance.html +1 -1
- package/docs/types/CSS3DRenderExportType.html +1 -1
- package/docs/types/CSS3DRenderPluginExportType.html +1 -1
- package/docs/types/CSS3DRenderPluginParameterType.html +1 -1
- package/docs/types/ClassFunctionParameters.html +1 -1
- package/docs/types/Color.html +1 -1
- package/docs/types/ContentTypeConfigKey.html +1 -1
- package/docs/types/ContentTypeConfigKeySplit.html +1 -1
- package/docs/types/ContentTypeMap.html +1 -1
- package/docs/types/Create3DDomContainerReturnType.html +1 -1
- package/docs/types/Create3DElementReturnType.html +1 -1
- package/docs/types/CruisePluginExportType.html +1 -1
- package/docs/types/CruisePluginTypes.CruiseData.html +2 -2
- package/docs/types/CruisePluginTypes.MoveEffect.html +1 -1
- package/docs/types/CurrentPanoImagePluginExportType.html +1 -1
- package/docs/types/DeprecatedMediaPlaneProperty.html +2 -2
- package/docs/types/DeprecatedTagProperty.html +2 -2
- package/docs/types/Direction-1.html +1 -1
- package/docs/types/Direction4.html +1 -1
- package/docs/types/ElementRenderer.html +2 -2
- package/docs/types/FloorplanGuidePluginParameterType.html +1 -0
- package/docs/types/FloorplanGuidePluginReturnType.html +1 -0
- package/docs/types/FloorplanRuleLabels.html +2 -2
- package/docs/types/FloorplanServerRuleLabels.html +1 -1
- package/docs/types/GuideLinePluginExportType.html +1 -1
- package/docs/types/GuideLinePluginType.GuideLineItem.html +2 -2
- package/docs/types/GuideLinePluginType.GuideLineItemEventMap.html +1 -1
- package/docs/types/GuideLinePluginType.GuideLineModeItemMode.html +1 -1
- package/docs/types/GuideLinePluginType.GuideLineStyle.html +2 -2
- package/docs/types/GuideLinePluginType.ModelGuideLineTag.html +2 -2
- package/docs/types/GuideLinePluginType.PathItem.html +2 -2
- package/docs/types/GuideLinePluginType.PluginData.html +2 -2
- package/docs/types/GuideLinePluginType.RouteConfig.html +2 -2
- package/docs/types/HelperEventMap.html +1 -1
- package/docs/types/InternalHelperEventMap.html +1 -1
- package/docs/types/MapviewFloorplanPluginParameterType.html +1 -1
- package/docs/types/MapviewFloorplanPluginReturnType.html +1 -1
- package/docs/types/MeasureEndReason.html +1 -1
- package/docs/types/MeasurePluginConfig.html +2 -2
- package/docs/types/MediaData.html +2 -2
- package/docs/types/MediaStore.html +1 -1
- package/docs/types/ModelEntryDoorGuidePluginParameterType.html +1 -1
- package/docs/types/ModelFloorplanPluginParameterType.html +1 -1
- package/docs/types/ModelFloorplanPluginReturnType.html +1 -1
- package/docs/types/ModelId.html +1 -1
- package/docs/types/ModelMakerPluginType.ElementRenderer.html +1 -1
- package/docs/types/ModelMakerPluginType.ItemType.html +2 -2
- package/docs/types/ModelMakerPluginType.MarkerItem.html +1 -1
- package/docs/types/ModelMakerPluginType.ServerItem.html +2 -2
- package/docs/types/ModelRoomLabelPluginParameters.html +1 -1
- package/docs/types/ModelRoomLabelPluginReturnType.html +1 -1
- package/docs/types/MoveArgs.html +2 -2
- package/docs/types/MoveOpts.html +2 -2
- package/docs/types/Object3DHelperEventMap.html +1 -1
- package/docs/types/ObjectFit.html +1 -1
- package/docs/types/PaintBrushEventMap.html +1 -1
- package/docs/types/PanoCompassPluginData.html +1 -1
- package/docs/types/PanoCompassPluginExportType.html +1 -1
- package/docs/types/PanoCompassPluginParameterType.html +1 -1
- package/docs/types/PanoFloorplanRadarPluginParameterType.html +1 -1
- package/docs/types/PanoFloorplanRadarPluginReturnType.html +1 -1
- package/docs/types/PanoIndex.html +1 -1
- package/docs/types/PanoMeasurePluginEvent.html +1 -1
- package/docs/types/PanoMeasureReturnType.html +1 -1
- package/docs/types/PanoSpatialTagPluginId.html +1 -1
- package/docs/types/PanoTagPluginExportInterface.html +1 -1
- package/docs/types/PanoTagPluginParamsInterface.html +1 -1
- package/docs/types/PanoVideoPluginParameterType.html +1 -1
- package/docs/types/PanoVideoPluginReturnType.html +1 -1
- package/docs/types/PickTagContentTypeInContentTypeConfigKey.html +2 -2
- package/docs/types/PipelinePluginParameterType.html +1 -1
- package/docs/types/PipelinePluginReturnType.html +1 -1
- package/docs/types/PlaneTag.html +2 -2
- package/docs/types/Point2DTag.html +2 -2
- package/docs/types/Point3DTag.html +2 -2
- package/docs/types/PointTagInstance.html +1 -1
- package/docs/types/Position.html +1 -1
- package/docs/types/PositionFrom.html +1 -1
- package/docs/types/RotateArgs.html +2 -2
- package/docs/types/RotateOpts.html +2 -2
- package/docs/types/RuleLabelsKey.html +1 -1
- package/docs/types/RuleLabelsValue.html +1 -1
- package/docs/types/ScaleCallback.html +1 -1
- package/docs/types/ScalePosition.html +2 -2
- package/docs/types/SculptData.BoxData.html +1 -1
- package/docs/types/SculptData.CircleData.html +1 -1
- package/docs/types/SculptData.CylinderData.html +1 -1
- package/docs/types/SculptData.PointData.html +1 -1
- package/docs/types/SculptData.PolygonData.html +1 -1
- package/docs/types/SculptData.PolylineData.html +1 -1
- package/docs/types/SculptData.PrismData.html +1 -1
- package/docs/types/SculptData.RectangleData.html +1 -1
- package/docs/types/SculptType.Theme.html +2 -2
- package/docs/types/StickType.html +1 -1
- package/docs/types/Tag.html +2 -2
- package/docs/types/Tag2D.html +2 -2
- package/docs/types/Tag3D.html +2 -2
- package/docs/types/TagClickParams.html +1 -1
- package/docs/types/TagConfigByKey.html +1 -1
- package/docs/types/TagContentType.html +1 -1
- package/docs/types/TagContentTypeMapping.html +1 -1
- package/docs/types/TagDimensionType.html +1 -1
- package/docs/types/TagElement.html +2 -2
- package/docs/types/TagEvents.html +1 -1
- package/docs/types/TagGLTFObject.html +1 -1
- package/docs/types/TagHooks.html +1 -1
- package/docs/types/TagId.html +1 -1
- package/docs/types/TagInstance.html +1 -1
- package/docs/types/TagPlacement.html +2 -2
- package/docs/types/TagPointType.html +2 -2
- package/docs/types/TagRendererMap.html +1 -1
- package/docs/types/TopviewFloorplanPluginParameterType.html +1 -1
- package/docs/types/TopviewFloorplanPluginReturnType.html +1 -1
- package/docs/types/Util.ActionIfNoIntersection.html +1 -1
- package/docs/types/Util.AdherePoint.html +2 -2
- package/docs/types/Util.PointSelectorConfig.html +1 -1
- package/docs/types/WorkCode.html +1 -1
- package/docs/variables/FLOOR_TYPE_MAP.html +2 -2
- package/docs/variables/PLUGIN.html +1 -1
- package/docs/variables/ROOM_FETILE_TYPE_MAP.html +2 -2
- package/docs/variables/ROOM_TYPE_MAP.html +2 -2
- package/docs/variables/Util.CURRENT_PANO_IMAGE_DEFAULT_IMAGE.html +2 -2
- package/docs/variables/Util.DEFAULT_STATIC_PREFIX.html +2 -2
- package/docs/variables/Util.DNALOGEL_DEFAULT_ASSETS.html +2 -2
- package/docs/variables/Util.ENTRY_DOOR_DEFAULT_IMAGE.html +2 -2
- package/docs/variables/Util.FLOORPLAN_DEFAULT_IMAGE.html +2 -2
- package/docs/variables/Util.GUIDELINE_DEFAULT_ARROW_TEXTURE.html +2 -2
- package/docs/variables/Util.GUIDELINE_WHITE_ARROW_TEXTURE.html +2 -2
- package/docs/variables/Util.MODEL_CHASSIS_COMPASS_DEFAULT_MODEL.html +2 -2
- package/docs/variables/Util.MODEL_ENTRY_DOOR_GUIDE_PLUGIN_DEFAULT_MODEL.html +2 -2
- package/docs/variables/Util.PANO_COMPASS_DEFAULT_IMAGE.html +2 -2
- package/docs/variables/Util.PANO_SPATIAL_TAG_BLUR_IMAGE.html +2 -2
- package/docs/variables/Util.PANO_TAG_DEFAULT_LINK_ICON.html +2 -2
- package/docs/variables/Util.animeMap.html +1 -1
- package/docs/variables/defaultGlobalConfig.html +1 -1
- package/docs/variables/itemLabelPluginServerParams.html +1 -1
- package/docs/variables/modelItemLabelPluginServerParams.html +1 -1
- package/docs/variables/modelRoomLabelPluginServerParams.html +1 -1
- package/libs/base/BasePlugin.js +1 -1
- package/libs/floorplan/FloorplanGuidePlugin/Components/Camera.js +132 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/Camera.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.js +272 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/CurrentFloor.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.js +94 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/CurrentFloor/ExtraObjects.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/Main.js +585 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/Main.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/ObserverDots.js +142 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/ObserverDots.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.js +261 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabelItem.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabels.js +290 -0
- package/libs/floorplan/FloorplanGuidePlugin/Components/RoomLabels.svelte.d.ts +1 -0
- package/libs/floorplan/FloorplanGuidePlugin/Controller.d.ts +46 -0
- package/libs/floorplan/FloorplanGuidePlugin/Controller.js +306 -0
- package/libs/floorplan/FloorplanGuidePlugin/index.d.ts +7 -0
- package/libs/floorplan/FloorplanGuidePlugin/index.js +99 -0
- package/libs/floorplan/FloorplanGuidePlugin/typing.d.ts +146 -0
- package/libs/floorplan/FloorplanGuidePlugin/typing.js +1 -0
- package/libs/floorplan/index.d.ts +1 -0
- package/libs/index.js +156 -146
- package/libs/shared-utils/logger.js +1 -1
- package/package.json +1 -1
package/components/index.js
CHANGED
|
@@ -1,462 +1,893 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
function noop() {
|
|
5
8
|
}
|
|
6
|
-
const
|
|
9
|
+
const promise = () => Promise.resolve();
|
|
10
|
+
const state = {
|
|
7
11
|
__queue: Promise.resolve()
|
|
8
12
|
};
|
|
9
|
-
function
|
|
10
|
-
|
|
13
|
+
function queue(promiseCallback = promise) {
|
|
14
|
+
state.__queue = state.__queue.then(promiseCallback).catch(promise);
|
|
11
15
|
}
|
|
12
|
-
function
|
|
13
|
-
const
|
|
14
|
-
|
|
16
|
+
function transformCoords(coords, cw, ch) {
|
|
17
|
+
const _x = coords.x;
|
|
18
|
+
const _y = coords.y;
|
|
19
|
+
const x = Math.floor(_x / cw * 1e4) / 1e4;
|
|
20
|
+
const y = Math.floor(_y / ch * 1e4) / 1e4;
|
|
21
|
+
return { x, y };
|
|
15
22
|
}
|
|
16
|
-
function
|
|
17
|
-
const { x:
|
|
18
|
-
|
|
23
|
+
function unTransformCoords(coords, cw, ch) {
|
|
24
|
+
const { x: _x, y: _y } = coords;
|
|
25
|
+
const x = _x * cw;
|
|
26
|
+
const y = _y * ch;
|
|
27
|
+
return { x, y };
|
|
19
28
|
}
|
|
20
|
-
function
|
|
21
|
-
if (
|
|
29
|
+
function getQuadraticCurvePoint(points) {
|
|
30
|
+
if (points.length < 2)
|
|
22
31
|
return {};
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
const lastTwo = points.slice(-2);
|
|
33
|
+
const control = lastTwo[0];
|
|
34
|
+
const end = {
|
|
35
|
+
x: (lastTwo[0].x + lastTwo[1].x) / 2,
|
|
36
|
+
y: (lastTwo[0].y + lastTwo[1].y) / 2
|
|
26
37
|
};
|
|
27
|
-
return { control
|
|
38
|
+
return { control, end };
|
|
28
39
|
}
|
|
29
|
-
function
|
|
30
|
-
new Promise((
|
|
40
|
+
function execInterval(i, time, callback = noop) {
|
|
41
|
+
new Promise((resolve) => {
|
|
31
42
|
setTimeout(() => {
|
|
32
|
-
|
|
33
|
-
|
|
43
|
+
callback();
|
|
44
|
+
resolve(true);
|
|
45
|
+
}, time * i);
|
|
34
46
|
});
|
|
35
47
|
}
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
const _window = window;
|
|
49
|
+
const _requestAnimationFrame = window.requestAnimationFrame || _window.webkitRequestAnimationFrame || ((fn) => setTimeout(fn, 16));
|
|
50
|
+
function nextFrame(fn, delay = 0) {
|
|
51
|
+
if (delay <= 0)
|
|
52
|
+
_requestAnimationFrame(fn);
|
|
53
|
+
else
|
|
54
|
+
_requestAnimationFrame(() => nextFrame(fn, delay - 1));
|
|
39
55
|
}
|
|
40
|
-
var
|
|
56
|
+
var Easing = Object.freeze({
|
|
41
57
|
Linear: Object.freeze({
|
|
42
|
-
None: function(
|
|
43
|
-
return
|
|
58
|
+
None: function(amount) {
|
|
59
|
+
return amount;
|
|
44
60
|
},
|
|
45
|
-
In: function(
|
|
46
|
-
return
|
|
61
|
+
In: function(amount) {
|
|
62
|
+
return amount;
|
|
47
63
|
},
|
|
48
|
-
Out: function(
|
|
49
|
-
return
|
|
64
|
+
Out: function(amount) {
|
|
65
|
+
return amount;
|
|
50
66
|
},
|
|
51
|
-
InOut: function(
|
|
52
|
-
return
|
|
67
|
+
InOut: function(amount) {
|
|
68
|
+
return amount;
|
|
53
69
|
}
|
|
54
70
|
}),
|
|
55
71
|
Quadratic: Object.freeze({
|
|
56
|
-
In: function(
|
|
57
|
-
return
|
|
72
|
+
In: function(amount) {
|
|
73
|
+
return amount * amount;
|
|
58
74
|
},
|
|
59
|
-
Out: function(
|
|
60
|
-
return
|
|
75
|
+
Out: function(amount) {
|
|
76
|
+
return amount * (2 - amount);
|
|
61
77
|
},
|
|
62
|
-
InOut: function(
|
|
63
|
-
|
|
78
|
+
InOut: function(amount) {
|
|
79
|
+
if ((amount *= 2) < 1) {
|
|
80
|
+
return 0.5 * amount * amount;
|
|
81
|
+
}
|
|
82
|
+
return -0.5 * (--amount * (amount - 2) - 1);
|
|
64
83
|
}
|
|
65
84
|
}),
|
|
66
85
|
Cubic: Object.freeze({
|
|
67
|
-
In: function(
|
|
68
|
-
return
|
|
86
|
+
In: function(amount) {
|
|
87
|
+
return amount * amount * amount;
|
|
69
88
|
},
|
|
70
|
-
Out: function(
|
|
71
|
-
return --
|
|
89
|
+
Out: function(amount) {
|
|
90
|
+
return --amount * amount * amount + 1;
|
|
72
91
|
},
|
|
73
|
-
InOut: function(
|
|
74
|
-
|
|
92
|
+
InOut: function(amount) {
|
|
93
|
+
if ((amount *= 2) < 1) {
|
|
94
|
+
return 0.5 * amount * amount * amount;
|
|
95
|
+
}
|
|
96
|
+
return 0.5 * ((amount -= 2) * amount * amount + 2);
|
|
75
97
|
}
|
|
76
98
|
}),
|
|
77
99
|
Quartic: Object.freeze({
|
|
78
|
-
In: function(
|
|
79
|
-
return
|
|
100
|
+
In: function(amount) {
|
|
101
|
+
return amount * amount * amount * amount;
|
|
80
102
|
},
|
|
81
|
-
Out: function(
|
|
82
|
-
return 1 - --
|
|
103
|
+
Out: function(amount) {
|
|
104
|
+
return 1 - --amount * amount * amount * amount;
|
|
83
105
|
},
|
|
84
|
-
InOut: function(
|
|
85
|
-
|
|
106
|
+
InOut: function(amount) {
|
|
107
|
+
if ((amount *= 2) < 1) {
|
|
108
|
+
return 0.5 * amount * amount * amount * amount;
|
|
109
|
+
}
|
|
110
|
+
return -0.5 * ((amount -= 2) * amount * amount * amount - 2);
|
|
86
111
|
}
|
|
87
112
|
}),
|
|
88
113
|
Quintic: Object.freeze({
|
|
89
|
-
In: function(
|
|
90
|
-
return
|
|
114
|
+
In: function(amount) {
|
|
115
|
+
return amount * amount * amount * amount * amount;
|
|
91
116
|
},
|
|
92
|
-
Out: function(
|
|
93
|
-
return --
|
|
117
|
+
Out: function(amount) {
|
|
118
|
+
return --amount * amount * amount * amount * amount + 1;
|
|
94
119
|
},
|
|
95
|
-
InOut: function(
|
|
96
|
-
|
|
120
|
+
InOut: function(amount) {
|
|
121
|
+
if ((amount *= 2) < 1) {
|
|
122
|
+
return 0.5 * amount * amount * amount * amount * amount;
|
|
123
|
+
}
|
|
124
|
+
return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);
|
|
97
125
|
}
|
|
98
126
|
}),
|
|
99
127
|
Sinusoidal: Object.freeze({
|
|
100
|
-
In: function(
|
|
101
|
-
return 1 - Math.sin((1 -
|
|
128
|
+
In: function(amount) {
|
|
129
|
+
return 1 - Math.sin((1 - amount) * Math.PI / 2);
|
|
102
130
|
},
|
|
103
|
-
Out: function(
|
|
104
|
-
return Math.sin(
|
|
131
|
+
Out: function(amount) {
|
|
132
|
+
return Math.sin(amount * Math.PI / 2);
|
|
105
133
|
},
|
|
106
|
-
InOut: function(
|
|
107
|
-
return 0.5 * (1 - Math.sin(Math.PI * (0.5 -
|
|
134
|
+
InOut: function(amount) {
|
|
135
|
+
return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));
|
|
108
136
|
}
|
|
109
137
|
}),
|
|
110
138
|
Exponential: Object.freeze({
|
|
111
|
-
In: function(
|
|
112
|
-
return
|
|
139
|
+
In: function(amount) {
|
|
140
|
+
return amount === 0 ? 0 : Math.pow(1024, amount - 1);
|
|
113
141
|
},
|
|
114
|
-
Out: function(
|
|
115
|
-
return
|
|
142
|
+
Out: function(amount) {
|
|
143
|
+
return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);
|
|
116
144
|
},
|
|
117
|
-
InOut: function(
|
|
118
|
-
|
|
145
|
+
InOut: function(amount) {
|
|
146
|
+
if (amount === 0) {
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
if (amount === 1) {
|
|
150
|
+
return 1;
|
|
151
|
+
}
|
|
152
|
+
if ((amount *= 2) < 1) {
|
|
153
|
+
return 0.5 * Math.pow(1024, amount - 1);
|
|
154
|
+
}
|
|
155
|
+
return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);
|
|
119
156
|
}
|
|
120
157
|
}),
|
|
121
158
|
Circular: Object.freeze({
|
|
122
|
-
In: function(
|
|
123
|
-
return 1 - Math.sqrt(1 -
|
|
159
|
+
In: function(amount) {
|
|
160
|
+
return 1 - Math.sqrt(1 - amount * amount);
|
|
124
161
|
},
|
|
125
|
-
Out: function(
|
|
126
|
-
return Math.sqrt(1 - --
|
|
162
|
+
Out: function(amount) {
|
|
163
|
+
return Math.sqrt(1 - --amount * amount);
|
|
127
164
|
},
|
|
128
|
-
InOut: function(
|
|
129
|
-
|
|
165
|
+
InOut: function(amount) {
|
|
166
|
+
if ((amount *= 2) < 1) {
|
|
167
|
+
return -0.5 * (Math.sqrt(1 - amount * amount) - 1);
|
|
168
|
+
}
|
|
169
|
+
return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);
|
|
130
170
|
}
|
|
131
171
|
}),
|
|
132
172
|
Elastic: Object.freeze({
|
|
133
|
-
In: function(
|
|
134
|
-
|
|
173
|
+
In: function(amount) {
|
|
174
|
+
if (amount === 0) {
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
if (amount === 1) {
|
|
178
|
+
return 1;
|
|
179
|
+
}
|
|
180
|
+
return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
|
|
135
181
|
},
|
|
136
|
-
Out: function(
|
|
137
|
-
|
|
182
|
+
Out: function(amount) {
|
|
183
|
+
if (amount === 0) {
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
if (amount === 1) {
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;
|
|
138
190
|
},
|
|
139
|
-
InOut: function(
|
|
140
|
-
|
|
191
|
+
InOut: function(amount) {
|
|
192
|
+
if (amount === 0) {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
if (amount === 1) {
|
|
196
|
+
return 1;
|
|
197
|
+
}
|
|
198
|
+
amount *= 2;
|
|
199
|
+
if (amount < 1) {
|
|
200
|
+
return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);
|
|
201
|
+
}
|
|
202
|
+
return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;
|
|
141
203
|
}
|
|
142
204
|
}),
|
|
143
205
|
Back: Object.freeze({
|
|
144
|
-
In: function(
|
|
145
|
-
var
|
|
146
|
-
return
|
|
206
|
+
In: function(amount) {
|
|
207
|
+
var s = 1.70158;
|
|
208
|
+
return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);
|
|
147
209
|
},
|
|
148
|
-
Out: function(
|
|
149
|
-
var
|
|
150
|
-
return
|
|
210
|
+
Out: function(amount) {
|
|
211
|
+
var s = 1.70158;
|
|
212
|
+
return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;
|
|
151
213
|
},
|
|
152
|
-
InOut: function(
|
|
153
|
-
var
|
|
154
|
-
|
|
214
|
+
InOut: function(amount) {
|
|
215
|
+
var s = 1.70158 * 1.525;
|
|
216
|
+
if ((amount *= 2) < 1) {
|
|
217
|
+
return 0.5 * (amount * amount * ((s + 1) * amount - s));
|
|
218
|
+
}
|
|
219
|
+
return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);
|
|
155
220
|
}
|
|
156
221
|
}),
|
|
157
222
|
Bounce: Object.freeze({
|
|
158
|
-
In: function(
|
|
159
|
-
return 1 -
|
|
223
|
+
In: function(amount) {
|
|
224
|
+
return 1 - Easing.Bounce.Out(1 - amount);
|
|
160
225
|
},
|
|
161
|
-
Out: function(
|
|
162
|
-
|
|
226
|
+
Out: function(amount) {
|
|
227
|
+
if (amount < 1 / 2.75) {
|
|
228
|
+
return 7.5625 * amount * amount;
|
|
229
|
+
} else if (amount < 2 / 2.75) {
|
|
230
|
+
return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;
|
|
231
|
+
} else if (amount < 2.5 / 2.75) {
|
|
232
|
+
return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;
|
|
233
|
+
} else {
|
|
234
|
+
return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;
|
|
235
|
+
}
|
|
163
236
|
},
|
|
164
|
-
InOut: function(
|
|
165
|
-
|
|
237
|
+
InOut: function(amount) {
|
|
238
|
+
if (amount < 0.5) {
|
|
239
|
+
return Easing.Bounce.In(amount * 2) * 0.5;
|
|
240
|
+
}
|
|
241
|
+
return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;
|
|
166
242
|
}
|
|
167
243
|
}),
|
|
168
|
-
generatePow: function(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
244
|
+
generatePow: function(power) {
|
|
245
|
+
if (power === void 0) {
|
|
246
|
+
power = 4;
|
|
247
|
+
}
|
|
248
|
+
power = power < Number.EPSILON ? Number.EPSILON : power;
|
|
249
|
+
power = power > 1e4 ? 1e4 : power;
|
|
250
|
+
return {
|
|
251
|
+
In: function(amount) {
|
|
252
|
+
return Math.pow(amount, power);
|
|
172
253
|
},
|
|
173
|
-
Out: function(
|
|
174
|
-
return 1 - Math.pow(1 -
|
|
254
|
+
Out: function(amount) {
|
|
255
|
+
return 1 - Math.pow(1 - amount, power);
|
|
175
256
|
},
|
|
176
|
-
InOut: function(
|
|
177
|
-
|
|
257
|
+
InOut: function(amount) {
|
|
258
|
+
if (amount < 0.5) {
|
|
259
|
+
return Math.pow(amount * 2, power) / 2;
|
|
260
|
+
}
|
|
261
|
+
return (1 - Math.pow(2 - amount * 2, power)) / 2 + 0.5;
|
|
178
262
|
}
|
|
179
263
|
};
|
|
180
264
|
}
|
|
181
|
-
})
|
|
265
|
+
});
|
|
266
|
+
var now = function() {
|
|
182
267
|
return performance.now();
|
|
183
|
-
}
|
|
268
|
+
};
|
|
269
|
+
var Group = (
|
|
184
270
|
/** @class */
|
|
185
271
|
function() {
|
|
186
|
-
function
|
|
187
|
-
this._tweens = {}
|
|
272
|
+
function Group2() {
|
|
273
|
+
this._tweens = {};
|
|
274
|
+
this._tweensAddedDuringUpdate = {};
|
|
188
275
|
}
|
|
189
|
-
|
|
190
|
-
var
|
|
191
|
-
return Object.keys(this._tweens).map(function(
|
|
192
|
-
return
|
|
276
|
+
Group2.prototype.getAll = function() {
|
|
277
|
+
var _this = this;
|
|
278
|
+
return Object.keys(this._tweens).map(function(tweenId) {
|
|
279
|
+
return _this._tweens[tweenId];
|
|
193
280
|
});
|
|
194
|
-
}
|
|
281
|
+
};
|
|
282
|
+
Group2.prototype.removeAll = function() {
|
|
195
283
|
this._tweens = {};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
284
|
+
};
|
|
285
|
+
Group2.prototype.add = function(tween2) {
|
|
286
|
+
this._tweens[tween2.getId()] = tween2;
|
|
287
|
+
this._tweensAddedDuringUpdate[tween2.getId()] = tween2;
|
|
288
|
+
};
|
|
289
|
+
Group2.prototype.remove = function(tween2) {
|
|
290
|
+
delete this._tweens[tween2.getId()];
|
|
291
|
+
delete this._tweensAddedDuringUpdate[tween2.getId()];
|
|
292
|
+
};
|
|
293
|
+
Group2.prototype.update = function(time, preserve) {
|
|
294
|
+
if (time === void 0) {
|
|
295
|
+
time = now();
|
|
296
|
+
}
|
|
297
|
+
if (preserve === void 0) {
|
|
298
|
+
preserve = false;
|
|
299
|
+
}
|
|
300
|
+
var tweenIds = Object.keys(this._tweens);
|
|
301
|
+
if (tweenIds.length === 0) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
while (tweenIds.length > 0) {
|
|
206
305
|
this._tweensAddedDuringUpdate = {};
|
|
207
|
-
for (var
|
|
208
|
-
var
|
|
209
|
-
|
|
306
|
+
for (var i = 0; i < tweenIds.length; i++) {
|
|
307
|
+
var tween2 = this._tweens[tweenIds[i]];
|
|
308
|
+
var autoStart = !preserve;
|
|
309
|
+
if (tween2 && tween2.update(time, autoStart) === false && !preserve) {
|
|
310
|
+
delete this._tweens[tweenIds[i]];
|
|
311
|
+
}
|
|
210
312
|
}
|
|
211
|
-
|
|
313
|
+
tweenIds = Object.keys(this._tweensAddedDuringUpdate);
|
|
212
314
|
}
|
|
213
|
-
return
|
|
214
|
-
}
|
|
315
|
+
return true;
|
|
316
|
+
};
|
|
317
|
+
return Group2;
|
|
215
318
|
}()
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
319
|
+
);
|
|
320
|
+
var Interpolation = {
|
|
321
|
+
Linear: function(v, k) {
|
|
322
|
+
var m = v.length - 1;
|
|
323
|
+
var f = m * k;
|
|
324
|
+
var i = Math.floor(f);
|
|
325
|
+
var fn = Interpolation.Utils.Linear;
|
|
326
|
+
if (k < 0) {
|
|
327
|
+
return fn(v[0], v[1], f);
|
|
328
|
+
}
|
|
329
|
+
if (k > 1) {
|
|
330
|
+
return fn(v[m], v[m - 1], m - f);
|
|
331
|
+
}
|
|
332
|
+
return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);
|
|
220
333
|
},
|
|
221
|
-
Bezier: function(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
334
|
+
Bezier: function(v, k) {
|
|
335
|
+
var b = 0;
|
|
336
|
+
var n = v.length - 1;
|
|
337
|
+
var pw = Math.pow;
|
|
338
|
+
var bn = Interpolation.Utils.Bernstein;
|
|
339
|
+
for (var i = 0; i <= n; i++) {
|
|
340
|
+
b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);
|
|
341
|
+
}
|
|
342
|
+
return b;
|
|
225
343
|
},
|
|
226
|
-
CatmullRom: function(
|
|
227
|
-
var
|
|
228
|
-
|
|
344
|
+
CatmullRom: function(v, k) {
|
|
345
|
+
var m = v.length - 1;
|
|
346
|
+
var f = m * k;
|
|
347
|
+
var i = Math.floor(f);
|
|
348
|
+
var fn = Interpolation.Utils.CatmullRom;
|
|
349
|
+
if (v[0] === v[m]) {
|
|
350
|
+
if (k < 0) {
|
|
351
|
+
i = Math.floor(f = m * (1 + k));
|
|
352
|
+
}
|
|
353
|
+
return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);
|
|
354
|
+
} else {
|
|
355
|
+
if (k < 0) {
|
|
356
|
+
return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);
|
|
357
|
+
}
|
|
358
|
+
if (k > 1) {
|
|
359
|
+
return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);
|
|
360
|
+
}
|
|
361
|
+
return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);
|
|
362
|
+
}
|
|
229
363
|
},
|
|
230
364
|
Utils: {
|
|
231
|
-
Linear: function(
|
|
232
|
-
return (
|
|
365
|
+
Linear: function(p0, p1, t) {
|
|
366
|
+
return (p1 - p0) * t + p0;
|
|
233
367
|
},
|
|
234
|
-
Bernstein: function(
|
|
235
|
-
var
|
|
236
|
-
return
|
|
368
|
+
Bernstein: function(n, i) {
|
|
369
|
+
var fc = Interpolation.Utils.Factorial;
|
|
370
|
+
return fc(n) / fc(i) / fc(n - i);
|
|
237
371
|
},
|
|
238
372
|
Factorial: function() {
|
|
239
|
-
var
|
|
240
|
-
return function(
|
|
241
|
-
var
|
|
242
|
-
if (
|
|
243
|
-
return
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
373
|
+
var a = [1];
|
|
374
|
+
return function(n) {
|
|
375
|
+
var s = 1;
|
|
376
|
+
if (a[n]) {
|
|
377
|
+
return a[n];
|
|
378
|
+
}
|
|
379
|
+
for (var i = n; i > 1; i--) {
|
|
380
|
+
s *= i;
|
|
381
|
+
}
|
|
382
|
+
a[n] = s;
|
|
383
|
+
return s;
|
|
247
384
|
};
|
|
248
385
|
}(),
|
|
249
|
-
CatmullRom: function(
|
|
250
|
-
var
|
|
251
|
-
|
|
386
|
+
CatmullRom: function(p0, p1, p2, p3, t) {
|
|
387
|
+
var v0 = (p2 - p0) * 0.5;
|
|
388
|
+
var v1 = (p3 - p1) * 0.5;
|
|
389
|
+
var t2 = t * t;
|
|
390
|
+
var t3 = t * t2;
|
|
391
|
+
return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
|
|
252
392
|
}
|
|
253
393
|
}
|
|
254
|
-
}
|
|
394
|
+
};
|
|
395
|
+
var Sequence = (
|
|
255
396
|
/** @class */
|
|
256
397
|
function() {
|
|
257
|
-
function
|
|
398
|
+
function Sequence2() {
|
|
258
399
|
}
|
|
259
|
-
|
|
260
|
-
return
|
|
261
|
-
}
|
|
400
|
+
Sequence2.nextId = function() {
|
|
401
|
+
return Sequence2._nextId++;
|
|
402
|
+
};
|
|
403
|
+
Sequence2._nextId = 0;
|
|
404
|
+
return Sequence2;
|
|
262
405
|
}()
|
|
263
|
-
)
|
|
406
|
+
);
|
|
407
|
+
var mainGroup = new Group();
|
|
408
|
+
var Tween = (
|
|
264
409
|
/** @class */
|
|
265
410
|
function() {
|
|
266
|
-
function
|
|
267
|
-
|
|
411
|
+
function Tween2(_object, _group) {
|
|
412
|
+
if (_group === void 0) {
|
|
413
|
+
_group = mainGroup;
|
|
414
|
+
}
|
|
415
|
+
this._object = _object;
|
|
416
|
+
this._group = _group;
|
|
417
|
+
this._isPaused = false;
|
|
418
|
+
this._pauseStart = 0;
|
|
419
|
+
this._valuesStart = {};
|
|
420
|
+
this._valuesEnd = {};
|
|
421
|
+
this._valuesStartRepeat = {};
|
|
422
|
+
this._duration = 1e3;
|
|
423
|
+
this._isDynamic = false;
|
|
424
|
+
this._initialRepeat = 0;
|
|
425
|
+
this._repeat = 0;
|
|
426
|
+
this._yoyo = false;
|
|
427
|
+
this._isPlaying = false;
|
|
428
|
+
this._reversed = false;
|
|
429
|
+
this._delayTime = 0;
|
|
430
|
+
this._startTime = 0;
|
|
431
|
+
this._easingFunction = Easing.Linear.None;
|
|
432
|
+
this._interpolationFunction = Interpolation.Linear;
|
|
433
|
+
this._chainedTweens = [];
|
|
434
|
+
this._onStartCallbackFired = false;
|
|
435
|
+
this._onEveryStartCallbackFired = false;
|
|
436
|
+
this._id = Sequence.nextId();
|
|
437
|
+
this._isChainStopped = false;
|
|
438
|
+
this._propertiesAreSetUp = false;
|
|
439
|
+
this._goToEnd = false;
|
|
268
440
|
}
|
|
269
|
-
|
|
441
|
+
Tween2.prototype.getId = function() {
|
|
270
442
|
return this._id;
|
|
271
|
-
}
|
|
443
|
+
};
|
|
444
|
+
Tween2.prototype.isPlaying = function() {
|
|
272
445
|
return this._isPlaying;
|
|
273
|
-
}
|
|
446
|
+
};
|
|
447
|
+
Tween2.prototype.isPaused = function() {
|
|
274
448
|
return this._isPaused;
|
|
275
|
-
}
|
|
449
|
+
};
|
|
450
|
+
Tween2.prototype.getDuration = function() {
|
|
276
451
|
return this._duration;
|
|
277
|
-
}
|
|
278
|
-
|
|
452
|
+
};
|
|
453
|
+
Tween2.prototype.to = function(target, duration) {
|
|
454
|
+
if (duration === void 0) {
|
|
455
|
+
duration = 1e3;
|
|
456
|
+
}
|
|
457
|
+
if (this._isPlaying)
|
|
279
458
|
throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if (
|
|
459
|
+
this._valuesEnd = target;
|
|
460
|
+
this._propertiesAreSetUp = false;
|
|
461
|
+
this._duration = duration < 0 ? 0 : duration;
|
|
462
|
+
return this;
|
|
463
|
+
};
|
|
464
|
+
Tween2.prototype.duration = function(duration) {
|
|
465
|
+
if (duration === void 0) {
|
|
466
|
+
duration = 1e3;
|
|
467
|
+
}
|
|
468
|
+
this._duration = duration < 0 ? 0 : duration;
|
|
469
|
+
return this;
|
|
470
|
+
};
|
|
471
|
+
Tween2.prototype.dynamic = function(dynamic) {
|
|
472
|
+
if (dynamic === void 0) {
|
|
473
|
+
dynamic = false;
|
|
474
|
+
}
|
|
475
|
+
this._isDynamic = dynamic;
|
|
476
|
+
return this;
|
|
477
|
+
};
|
|
478
|
+
Tween2.prototype.start = function(time, overrideStartingValues) {
|
|
479
|
+
if (time === void 0) {
|
|
480
|
+
time = now();
|
|
481
|
+
}
|
|
482
|
+
if (overrideStartingValues === void 0) {
|
|
483
|
+
overrideStartingValues = false;
|
|
484
|
+
}
|
|
485
|
+
if (this._isPlaying) {
|
|
287
486
|
return this;
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
for (var r in this._valuesEnd)
|
|
297
|
-
s[r] = this._valuesEnd[r];
|
|
298
|
-
this._valuesEnd = s;
|
|
487
|
+
}
|
|
488
|
+
this._group && this._group.add(this);
|
|
489
|
+
this._repeat = this._initialRepeat;
|
|
490
|
+
if (this._reversed) {
|
|
491
|
+
this._reversed = false;
|
|
492
|
+
for (var property in this._valuesStartRepeat) {
|
|
493
|
+
this._swapEndStartRepeatValues(property);
|
|
494
|
+
this._valuesStart[property] = this._valuesStartRepeat[property];
|
|
299
495
|
}
|
|
300
|
-
|
|
496
|
+
}
|
|
497
|
+
this._isPlaying = true;
|
|
498
|
+
this._isPaused = false;
|
|
499
|
+
this._onStartCallbackFired = false;
|
|
500
|
+
this._onEveryStartCallbackFired = false;
|
|
501
|
+
this._isChainStopped = false;
|
|
502
|
+
this._startTime = time;
|
|
503
|
+
this._startTime += this._delayTime;
|
|
504
|
+
if (!this._propertiesAreSetUp || overrideStartingValues) {
|
|
505
|
+
this._propertiesAreSetUp = true;
|
|
506
|
+
if (!this._isDynamic) {
|
|
507
|
+
var tmp = {};
|
|
508
|
+
for (var prop in this._valuesEnd)
|
|
509
|
+
tmp[prop] = this._valuesEnd[prop];
|
|
510
|
+
this._valuesEnd = tmp;
|
|
511
|
+
}
|
|
512
|
+
this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);
|
|
301
513
|
}
|
|
302
514
|
return this;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
}
|
|
321
|
-
I && (n[a] = l);
|
|
515
|
+
};
|
|
516
|
+
Tween2.prototype.startFromCurrentValues = function(time) {
|
|
517
|
+
return this.start(time, true);
|
|
518
|
+
};
|
|
519
|
+
Tween2.prototype._setupProperties = function(_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {
|
|
520
|
+
for (var property in _valuesEnd) {
|
|
521
|
+
var startValue = _object[property];
|
|
522
|
+
var startValueIsArray = Array.isArray(startValue);
|
|
523
|
+
var propType = startValueIsArray ? "array" : typeof startValue;
|
|
524
|
+
var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);
|
|
525
|
+
if (propType === "undefined" || propType === "function") {
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
if (isInterpolationList) {
|
|
529
|
+
var endValues = _valuesEnd[property];
|
|
530
|
+
if (endValues.length === 0) {
|
|
531
|
+
continue;
|
|
322
532
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
var
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
if (!this._isDynamic) {
|
|
331
|
-
var v = {};
|
|
332
|
-
for (var A in u)
|
|
333
|
-
v[A] = u[A];
|
|
334
|
-
n[a] = u = v;
|
|
533
|
+
var temp = [startValue];
|
|
534
|
+
for (var i = 0, l = endValues.length; i < l; i += 1) {
|
|
535
|
+
var value = this._handleRelativeValue(startValue, endValues[i]);
|
|
536
|
+
if (isNaN(value)) {
|
|
537
|
+
isInterpolationList = false;
|
|
538
|
+
console.warn("Found invalid interpolation list. Skipping.");
|
|
539
|
+
break;
|
|
335
540
|
}
|
|
336
|
-
|
|
337
|
-
}
|
|
338
|
-
|
|
541
|
+
temp.push(value);
|
|
542
|
+
}
|
|
543
|
+
if (isInterpolationList) {
|
|
544
|
+
_valuesEnd[property] = temp;
|
|
545
|
+
}
|
|
339
546
|
}
|
|
547
|
+
if ((propType === "object" || startValueIsArray) && startValue && !isInterpolationList) {
|
|
548
|
+
_valuesStart[property] = startValueIsArray ? [] : {};
|
|
549
|
+
var nestedObject = startValue;
|
|
550
|
+
for (var prop in nestedObject) {
|
|
551
|
+
_valuesStart[property][prop] = nestedObject[prop];
|
|
552
|
+
}
|
|
553
|
+
_valuesStartRepeat[property] = startValueIsArray ? [] : {};
|
|
554
|
+
var endValues = _valuesEnd[property];
|
|
555
|
+
if (!this._isDynamic) {
|
|
556
|
+
var tmp = {};
|
|
557
|
+
for (var prop in endValues)
|
|
558
|
+
tmp[prop] = endValues[prop];
|
|
559
|
+
_valuesEnd[property] = endValues = tmp;
|
|
560
|
+
}
|
|
561
|
+
this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);
|
|
562
|
+
} else {
|
|
563
|
+
if (typeof _valuesStart[property] === "undefined" || overrideStartingValues) {
|
|
564
|
+
_valuesStart[property] = startValue;
|
|
565
|
+
}
|
|
566
|
+
if (!startValueIsArray) {
|
|
567
|
+
_valuesStart[property] *= 1;
|
|
568
|
+
}
|
|
569
|
+
if (isInterpolationList) {
|
|
570
|
+
_valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();
|
|
571
|
+
} else {
|
|
572
|
+
_valuesStartRepeat[property] = _valuesStart[property] || 0;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
Tween2.prototype.stop = function() {
|
|
578
|
+
if (!this._isChainStopped) {
|
|
579
|
+
this._isChainStopped = true;
|
|
580
|
+
this.stopChainedTweens();
|
|
581
|
+
}
|
|
582
|
+
if (!this._isPlaying) {
|
|
583
|
+
return this;
|
|
584
|
+
}
|
|
585
|
+
this._group && this._group.remove(this);
|
|
586
|
+
this._isPlaying = false;
|
|
587
|
+
this._isPaused = false;
|
|
588
|
+
if (this._onStopCallback) {
|
|
589
|
+
this._onStopCallback(this._object);
|
|
340
590
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
return
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
591
|
+
return this;
|
|
592
|
+
};
|
|
593
|
+
Tween2.prototype.end = function() {
|
|
594
|
+
this._goToEnd = true;
|
|
595
|
+
this.update(Infinity);
|
|
596
|
+
return this;
|
|
597
|
+
};
|
|
598
|
+
Tween2.prototype.pause = function(time) {
|
|
599
|
+
if (time === void 0) {
|
|
600
|
+
time = now();
|
|
601
|
+
}
|
|
602
|
+
if (this._isPaused || !this._isPlaying) {
|
|
603
|
+
return this;
|
|
604
|
+
}
|
|
605
|
+
this._isPaused = true;
|
|
606
|
+
this._pauseStart = time;
|
|
607
|
+
this._group && this._group.remove(this);
|
|
608
|
+
return this;
|
|
609
|
+
};
|
|
610
|
+
Tween2.prototype.resume = function(time) {
|
|
611
|
+
if (time === void 0) {
|
|
612
|
+
time = now();
|
|
613
|
+
}
|
|
614
|
+
if (!this._isPaused || !this._isPlaying) {
|
|
615
|
+
return this;
|
|
616
|
+
}
|
|
617
|
+
this._isPaused = false;
|
|
618
|
+
this._startTime += time - this._pauseStart;
|
|
619
|
+
this._pauseStart = 0;
|
|
620
|
+
this._group && this._group.add(this);
|
|
621
|
+
return this;
|
|
622
|
+
};
|
|
623
|
+
Tween2.prototype.stopChainedTweens = function() {
|
|
624
|
+
for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
|
|
351
625
|
this._chainedTweens[i].stop();
|
|
626
|
+
}
|
|
627
|
+
return this;
|
|
628
|
+
};
|
|
629
|
+
Tween2.prototype.group = function(group) {
|
|
630
|
+
if (group === void 0) {
|
|
631
|
+
group = mainGroup;
|
|
632
|
+
}
|
|
633
|
+
this._group = group;
|
|
634
|
+
return this;
|
|
635
|
+
};
|
|
636
|
+
Tween2.prototype.delay = function(amount) {
|
|
637
|
+
if (amount === void 0) {
|
|
638
|
+
amount = 0;
|
|
639
|
+
}
|
|
640
|
+
this._delayTime = amount;
|
|
641
|
+
return this;
|
|
642
|
+
};
|
|
643
|
+
Tween2.prototype.repeat = function(times) {
|
|
644
|
+
if (times === void 0) {
|
|
645
|
+
times = 0;
|
|
646
|
+
}
|
|
647
|
+
this._initialRepeat = times;
|
|
648
|
+
this._repeat = times;
|
|
352
649
|
return this;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
return
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return this
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
650
|
+
};
|
|
651
|
+
Tween2.prototype.repeatDelay = function(amount) {
|
|
652
|
+
this._repeatDelayTime = amount;
|
|
653
|
+
return this;
|
|
654
|
+
};
|
|
655
|
+
Tween2.prototype.yoyo = function(yoyo) {
|
|
656
|
+
if (yoyo === void 0) {
|
|
657
|
+
yoyo = false;
|
|
658
|
+
}
|
|
659
|
+
this._yoyo = yoyo;
|
|
660
|
+
return this;
|
|
661
|
+
};
|
|
662
|
+
Tween2.prototype.easing = function(easingFunction) {
|
|
663
|
+
if (easingFunction === void 0) {
|
|
664
|
+
easingFunction = Easing.Linear.None;
|
|
665
|
+
}
|
|
666
|
+
this._easingFunction = easingFunction;
|
|
667
|
+
return this;
|
|
668
|
+
};
|
|
669
|
+
Tween2.prototype.interpolation = function(interpolationFunction) {
|
|
670
|
+
if (interpolationFunction === void 0) {
|
|
671
|
+
interpolationFunction = Interpolation.Linear;
|
|
672
|
+
}
|
|
673
|
+
this._interpolationFunction = interpolationFunction;
|
|
674
|
+
return this;
|
|
675
|
+
};
|
|
676
|
+
Tween2.prototype.chain = function() {
|
|
677
|
+
var tweens = [];
|
|
678
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
679
|
+
tweens[_i] = arguments[_i];
|
|
680
|
+
}
|
|
681
|
+
this._chainedTweens = tweens;
|
|
682
|
+
return this;
|
|
683
|
+
};
|
|
684
|
+
Tween2.prototype.onStart = function(callback) {
|
|
685
|
+
this._onStartCallback = callback;
|
|
686
|
+
return this;
|
|
687
|
+
};
|
|
688
|
+
Tween2.prototype.onEveryStart = function(callback) {
|
|
689
|
+
this._onEveryStartCallback = callback;
|
|
690
|
+
return this;
|
|
691
|
+
};
|
|
692
|
+
Tween2.prototype.onUpdate = function(callback) {
|
|
693
|
+
this._onUpdateCallback = callback;
|
|
694
|
+
return this;
|
|
695
|
+
};
|
|
696
|
+
Tween2.prototype.onRepeat = function(callback) {
|
|
697
|
+
this._onRepeatCallback = callback;
|
|
698
|
+
return this;
|
|
699
|
+
};
|
|
700
|
+
Tween2.prototype.onComplete = function(callback) {
|
|
701
|
+
this._onCompleteCallback = callback;
|
|
702
|
+
return this;
|
|
703
|
+
};
|
|
704
|
+
Tween2.prototype.onStop = function(callback) {
|
|
705
|
+
this._onStopCallback = callback;
|
|
706
|
+
return this;
|
|
707
|
+
};
|
|
708
|
+
Tween2.prototype.update = function(time, autoStart) {
|
|
709
|
+
var _this = this;
|
|
710
|
+
var _a;
|
|
711
|
+
if (time === void 0) {
|
|
712
|
+
time = now();
|
|
713
|
+
}
|
|
714
|
+
if (autoStart === void 0) {
|
|
715
|
+
autoStart = true;
|
|
716
|
+
}
|
|
717
|
+
if (this._isPaused)
|
|
718
|
+
return true;
|
|
719
|
+
var property;
|
|
720
|
+
var endTime = this._startTime + this._duration;
|
|
388
721
|
if (!this._goToEnd && !this._isPlaying) {
|
|
389
|
-
if (
|
|
390
|
-
return
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
722
|
+
if (time > endTime)
|
|
723
|
+
return false;
|
|
724
|
+
if (autoStart)
|
|
725
|
+
this.start(time, true);
|
|
726
|
+
}
|
|
727
|
+
this._goToEnd = false;
|
|
728
|
+
if (time < this._startTime) {
|
|
729
|
+
return true;
|
|
730
|
+
}
|
|
731
|
+
if (this._onStartCallbackFired === false) {
|
|
732
|
+
if (this._onStartCallback) {
|
|
733
|
+
this._onStartCallback(this._object);
|
|
734
|
+
}
|
|
735
|
+
this._onStartCallbackFired = true;
|
|
736
|
+
}
|
|
737
|
+
if (this._onEveryStartCallbackFired === false) {
|
|
738
|
+
if (this._onEveryStartCallback) {
|
|
739
|
+
this._onEveryStartCallback(this._object);
|
|
740
|
+
}
|
|
741
|
+
this._onEveryStartCallbackFired = true;
|
|
742
|
+
}
|
|
743
|
+
var elapsedTime = time - this._startTime;
|
|
744
|
+
var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);
|
|
745
|
+
var totalTime = this._duration + this._repeat * durationAndDelay;
|
|
746
|
+
var calculateElapsedPortion = function() {
|
|
747
|
+
if (_this._duration === 0)
|
|
398
748
|
return 1;
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
749
|
+
if (elapsedTime > totalTime) {
|
|
750
|
+
return 1;
|
|
751
|
+
}
|
|
752
|
+
var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);
|
|
753
|
+
var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;
|
|
754
|
+
var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);
|
|
755
|
+
if (portion === 0 && elapsedTime === _this._duration) {
|
|
756
|
+
return 1;
|
|
757
|
+
}
|
|
758
|
+
return portion;
|
|
759
|
+
};
|
|
760
|
+
var elapsed = calculateElapsedPortion();
|
|
761
|
+
var value = this._easingFunction(elapsed);
|
|
762
|
+
this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);
|
|
763
|
+
if (this._onUpdateCallback) {
|
|
764
|
+
this._onUpdateCallback(this._object, elapsed);
|
|
765
|
+
}
|
|
766
|
+
if (this._duration === 0 || elapsedTime >= this._duration) {
|
|
403
767
|
if (this._repeat > 0) {
|
|
404
|
-
var
|
|
405
|
-
isFinite(this._repeat)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
768
|
+
var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);
|
|
769
|
+
if (isFinite(this._repeat)) {
|
|
770
|
+
this._repeat -= completeCount;
|
|
771
|
+
}
|
|
772
|
+
for (property in this._valuesStartRepeat) {
|
|
773
|
+
if (!this._yoyo && typeof this._valuesEnd[property] === "string") {
|
|
774
|
+
this._valuesStartRepeat[property] = // eslint-disable-next-line
|
|
775
|
+
// @ts-ignore FIXME?
|
|
776
|
+
this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);
|
|
777
|
+
}
|
|
778
|
+
if (this._yoyo) {
|
|
779
|
+
this._swapEndStartRepeatValues(property);
|
|
780
|
+
}
|
|
781
|
+
this._valuesStart[property] = this._valuesStartRepeat[property];
|
|
782
|
+
}
|
|
783
|
+
if (this._yoyo) {
|
|
784
|
+
this._reversed = !this._reversed;
|
|
785
|
+
}
|
|
786
|
+
this._startTime += durationAndDelay * completeCount;
|
|
787
|
+
if (this._onRepeatCallback) {
|
|
788
|
+
this._onRepeatCallback(this._object);
|
|
789
|
+
}
|
|
790
|
+
this._onEveryStartCallbackFired = false;
|
|
791
|
+
return true;
|
|
411
792
|
} else {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
793
|
+
if (this._onCompleteCallback) {
|
|
794
|
+
this._onCompleteCallback(this._object);
|
|
795
|
+
}
|
|
796
|
+
for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {
|
|
797
|
+
this._chainedTweens[i].start(this._startTime + this._duration, false);
|
|
798
|
+
}
|
|
799
|
+
this._isPlaying = false;
|
|
800
|
+
return false;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
return true;
|
|
804
|
+
};
|
|
805
|
+
Tween2.prototype._updateProperties = function(_object, _valuesStart, _valuesEnd, value) {
|
|
806
|
+
for (var property in _valuesEnd) {
|
|
807
|
+
if (_valuesStart[property] === void 0) {
|
|
808
|
+
continue;
|
|
416
809
|
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
810
|
+
var start = _valuesStart[property] || 0;
|
|
811
|
+
var end = _valuesEnd[property];
|
|
812
|
+
var startIsArray = Array.isArray(_object[property]);
|
|
813
|
+
var endIsArray = Array.isArray(end);
|
|
814
|
+
var isInterpolationList = !startIsArray && endIsArray;
|
|
815
|
+
if (isInterpolationList) {
|
|
816
|
+
_object[property] = this._interpolationFunction(end, value);
|
|
817
|
+
} else if (typeof end === "object" && end) {
|
|
818
|
+
this._updateProperties(_object[property], start, end, value);
|
|
819
|
+
} else {
|
|
820
|
+
end = this._handleRelativeValue(start, end);
|
|
821
|
+
if (typeof end === "number") {
|
|
822
|
+
_object[property] = start + (end - start) * value;
|
|
823
|
+
}
|
|
423
824
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
825
|
+
}
|
|
826
|
+
};
|
|
827
|
+
Tween2.prototype._handleRelativeValue = function(start, end) {
|
|
828
|
+
if (typeof end !== "string") {
|
|
829
|
+
return end;
|
|
830
|
+
}
|
|
831
|
+
if (end.charAt(0) === "+" || end.charAt(0) === "-") {
|
|
832
|
+
return start + parseFloat(end);
|
|
833
|
+
}
|
|
834
|
+
return parseFloat(end);
|
|
835
|
+
};
|
|
836
|
+
Tween2.prototype._swapEndStartRepeatValues = function(property) {
|
|
837
|
+
var tmp = this._valuesStartRepeat[property];
|
|
838
|
+
var endValue = this._valuesEnd[property];
|
|
839
|
+
if (typeof endValue === "string") {
|
|
840
|
+
this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);
|
|
841
|
+
} else {
|
|
842
|
+
this._valuesStartRepeat[property] = this._valuesEnd[property];
|
|
843
|
+
}
|
|
844
|
+
this._valuesEnd[property] = tmp;
|
|
845
|
+
};
|
|
846
|
+
return Tween2;
|
|
430
847
|
}()
|
|
431
|
-
)
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
848
|
+
);
|
|
849
|
+
var TWEEN = mainGroup;
|
|
850
|
+
TWEEN.getAll.bind(TWEEN);
|
|
851
|
+
TWEEN.removeAll.bind(TWEEN);
|
|
852
|
+
TWEEN.add.bind(TWEEN);
|
|
853
|
+
TWEEN.remove.bind(TWEEN);
|
|
854
|
+
TWEEN.update.bind(TWEEN);
|
|
855
|
+
function tween(from, to, duration, easing = Easing.Linear.None) {
|
|
856
|
+
const tweenInstance = new Tween(from).to(to, duration).easing(easing).start();
|
|
857
|
+
function animate(time) {
|
|
858
|
+
if (!tweenInstance.update(time))
|
|
859
|
+
return;
|
|
860
|
+
requestAnimationFrame(animate);
|
|
861
|
+
}
|
|
862
|
+
requestAnimationFrame(animate);
|
|
863
|
+
return tweenInstance;
|
|
443
864
|
}
|
|
444
|
-
var
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
865
|
+
var PaintBrushTypeEnum = /* @__PURE__ */ ((PaintBrushTypeEnum2) => {
|
|
866
|
+
PaintBrushTypeEnum2["Drawline"] = "Drawline";
|
|
867
|
+
PaintBrushTypeEnum2["Undo"] = "Undo";
|
|
868
|
+
PaintBrushTypeEnum2["Exit"] = "Exit";
|
|
869
|
+
return PaintBrushTypeEnum2;
|
|
870
|
+
})(PaintBrushTypeEnum || {});
|
|
871
|
+
const EVENT_SYMBOL = Symbol("$$PAINT_BRUSH_EVENT$$");
|
|
872
|
+
function __generateEventIfNotExisted(instance) {
|
|
873
|
+
if (!instance[EVENT_SYMBOL]) {
|
|
874
|
+
instance[EVENT_SYMBOL] = {};
|
|
875
|
+
}
|
|
876
|
+
return instance[EVENT_SYMBOL];
|
|
448
877
|
}
|
|
449
|
-
function
|
|
450
|
-
|
|
878
|
+
function __removeEventIfNotExisted(instance) {
|
|
879
|
+
if (!instance[EVENT_SYMBOL]) {
|
|
880
|
+
delete instance[EVENT_SYMBOL];
|
|
881
|
+
}
|
|
451
882
|
}
|
|
452
|
-
class
|
|
883
|
+
class Subscribe {
|
|
453
884
|
/**
|
|
454
885
|
* 判断是否注册了事件
|
|
455
886
|
* @param name 事件类型
|
|
456
887
|
*/
|
|
457
|
-
hasListener(
|
|
458
|
-
const
|
|
459
|
-
return
|
|
888
|
+
hasListener(name) {
|
|
889
|
+
const events = __generateEventIfNotExisted(this);
|
|
890
|
+
return events && events[name] && events[name].length > 0;
|
|
460
891
|
}
|
|
461
892
|
/**
|
|
462
893
|
* 注册事件
|
|
@@ -467,9 +898,12 @@ class K {
|
|
|
467
898
|
* @template K 预设的监听事件名称
|
|
468
899
|
* @template C 回调函数函数上下文
|
|
469
900
|
*/
|
|
470
|
-
on(
|
|
471
|
-
const
|
|
472
|
-
|
|
901
|
+
on(name, callback, once) {
|
|
902
|
+
const events = __generateEventIfNotExisted(this);
|
|
903
|
+
if (!events[name])
|
|
904
|
+
events[name] = [];
|
|
905
|
+
events[name].push([callback, once || false]);
|
|
906
|
+
return () => this.off(name, callback);
|
|
473
907
|
}
|
|
474
908
|
/**
|
|
475
909
|
* 注册事件(是否只执行一次)
|
|
@@ -479,8 +913,8 @@ class K {
|
|
|
479
913
|
* @template K 预设的监听事件名称
|
|
480
914
|
* @template C 回调函数函数上下文
|
|
481
915
|
*/
|
|
482
|
-
once(
|
|
483
|
-
return this.on(
|
|
916
|
+
once(name, callback) {
|
|
917
|
+
return this.on(name, callback, true);
|
|
484
918
|
}
|
|
485
919
|
/**
|
|
486
920
|
* 解除事件
|
|
@@ -491,20 +925,26 @@ class K {
|
|
|
491
925
|
* @param callback 事件回调函数
|
|
492
926
|
* @template K 预设的监听事件名称
|
|
493
927
|
*/
|
|
494
|
-
off(
|
|
495
|
-
if (
|
|
496
|
-
|
|
928
|
+
off(name, callback) {
|
|
929
|
+
if (name === void 0) {
|
|
930
|
+
__removeEventIfNotExisted(this);
|
|
497
931
|
return;
|
|
498
932
|
}
|
|
499
|
-
const
|
|
500
|
-
if (
|
|
501
|
-
|
|
933
|
+
const events = __generateEventIfNotExisted(this);
|
|
934
|
+
if (!events[name])
|
|
935
|
+
events[name] = [];
|
|
936
|
+
if (callback === void 0) {
|
|
937
|
+
events[name].length = 0;
|
|
502
938
|
return;
|
|
503
939
|
}
|
|
504
|
-
let
|
|
505
|
-
for (;
|
|
506
|
-
|
|
507
|
-
|
|
940
|
+
let index = 0;
|
|
941
|
+
for (; index < events[name].length; index++) {
|
|
942
|
+
if (events[name][index][0] === callback)
|
|
943
|
+
break;
|
|
944
|
+
}
|
|
945
|
+
if (index < events[name].length) {
|
|
946
|
+
events[name].splice(index, 1);
|
|
947
|
+
}
|
|
508
948
|
}
|
|
509
949
|
/**
|
|
510
950
|
* 触发事件
|
|
@@ -513,23 +953,28 @@ class K {
|
|
|
513
953
|
* @returns canceled 是否被触发取消
|
|
514
954
|
* @template K 预设的监听事件名称
|
|
515
955
|
*/
|
|
516
|
-
emit(
|
|
517
|
-
let
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
956
|
+
emit(name, ...data) {
|
|
957
|
+
let canceled = false;
|
|
958
|
+
const events = __generateEventIfNotExisted(this);
|
|
959
|
+
const event = events[name] || [];
|
|
960
|
+
for (let one of event.slice()) {
|
|
961
|
+
const [callback, once = false] = one;
|
|
962
|
+
const result = callback(...data);
|
|
963
|
+
if (once)
|
|
964
|
+
this.off(name, callback);
|
|
965
|
+
if (result === false)
|
|
966
|
+
canceled = true;
|
|
522
967
|
}
|
|
523
|
-
return
|
|
968
|
+
return canceled;
|
|
524
969
|
}
|
|
525
970
|
}
|
|
526
|
-
function
|
|
971
|
+
function S4() {
|
|
527
972
|
return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
|
|
528
973
|
}
|
|
529
|
-
function
|
|
530
|
-
return (
|
|
974
|
+
function uuid() {
|
|
975
|
+
return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0, 3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
|
|
531
976
|
}
|
|
532
|
-
const
|
|
977
|
+
const PaintBrushStyle = `
|
|
533
978
|
<style type="text/css">
|
|
534
979
|
|
|
535
980
|
#_gl_paintBrush {
|
|
@@ -630,21 +1075,26 @@ transition: all 500ms;
|
|
|
630
1075
|
|
|
631
1076
|
</style>
|
|
632
1077
|
`;
|
|
633
|
-
class
|
|
634
|
-
constructor(
|
|
1078
|
+
class Controller extends Subscribe {
|
|
1079
|
+
constructor(configs) {
|
|
635
1080
|
super();
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
this.configs =
|
|
1081
|
+
__publicField(this, "configs");
|
|
1082
|
+
__publicField(this, "clientWidth");
|
|
1083
|
+
__publicField(this, "clientHeight");
|
|
1084
|
+
__publicField(this, "ready", false);
|
|
1085
|
+
__publicField(this, "uuid", uuid());
|
|
1086
|
+
__publicField(this, "tween");
|
|
1087
|
+
__publicField(this, "tweening", false);
|
|
1088
|
+
__publicField(this, "container");
|
|
1089
|
+
__publicField(this, "canvas");
|
|
1090
|
+
__publicField(this, "data", {});
|
|
1091
|
+
__publicField(this, "tempLine", {});
|
|
1092
|
+
this.configs = configs;
|
|
1093
|
+
this.clientWidth = document.body.clientWidth;
|
|
1094
|
+
this.clientHeight = document.body.clientHeight;
|
|
1095
|
+
this.container = this.ifInsertToDOM();
|
|
1096
|
+
this.canvas = {};
|
|
1097
|
+
this.initCtrl();
|
|
648
1098
|
}
|
|
649
1099
|
get color() {
|
|
650
1100
|
return this.configs.currentColor;
|
|
@@ -656,305 +1106,481 @@ class q extends K {
|
|
|
656
1106
|
return this.configs.DPR || 1;
|
|
657
1107
|
}
|
|
658
1108
|
ifInsertToDOM() {
|
|
659
|
-
if (this.container)
|
|
1109
|
+
if (this.container) {
|
|
660
1110
|
return this.container;
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
1111
|
+
}
|
|
1112
|
+
if (this.configs.container) {
|
|
1113
|
+
this.configs.container.id = "_gl_paintBrush";
|
|
1114
|
+
this.container = this.configs.container;
|
|
1115
|
+
} else if (!document.getElementById("_gl_paintBrush")) {
|
|
1116
|
+
const container = document.createElement("div");
|
|
1117
|
+
container.id = "_gl_paintBrush";
|
|
1118
|
+
document.body.appendChild(container);
|
|
1119
|
+
this.container = container;
|
|
1120
|
+
} else {
|
|
664
1121
|
this.container = document.getElementById("_gl_paintBrush");
|
|
665
|
-
else {
|
|
666
|
-
const e = document.createElement("div");
|
|
667
|
-
e.id = "_gl_paintBrush", document.body.appendChild(e), this.container = e;
|
|
668
1122
|
}
|
|
669
|
-
|
|
1123
|
+
this.container.innerHTML = PaintBrushStyle;
|
|
1124
|
+
return this.container;
|
|
670
1125
|
}
|
|
671
1126
|
/**
|
|
672
1127
|
*
|
|
673
1128
|
* @param className 初始化画板
|
|
674
1129
|
* @returns
|
|
675
1130
|
*/
|
|
676
|
-
initCanvas(
|
|
677
|
-
const
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
1131
|
+
initCanvas(className) {
|
|
1132
|
+
const canvas = document.createElement("canvas");
|
|
1133
|
+
canvas.className = className;
|
|
1134
|
+
canvas.width = this.clientWidth;
|
|
1135
|
+
canvas.height = this.clientHeight;
|
|
1136
|
+
const ctx = canvas.getContext("2d");
|
|
1137
|
+
if (!ctx)
|
|
1138
|
+
return;
|
|
1139
|
+
ctx.lineWidth = 5 * this.dpr;
|
|
1140
|
+
ctx.lineCap = "round";
|
|
1141
|
+
ctx.lineJoin = "round";
|
|
1142
|
+
this.container.appendChild(canvas);
|
|
1143
|
+
return canvas;
|
|
682
1144
|
}
|
|
683
1145
|
/**
|
|
684
1146
|
* 初始化操作面板
|
|
685
1147
|
* @returns
|
|
686
1148
|
*/
|
|
687
1149
|
initCtrl() {
|
|
688
|
-
const
|
|
689
|
-
|
|
690
|
-
const
|
|
691
|
-
|
|
692
|
-
const
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1150
|
+
const ctrl = document.createElement("div");
|
|
1151
|
+
ctrl.className = "_paintBrush-ctrl";
|
|
1152
|
+
const ctrl_inner = document.createElement("div");
|
|
1153
|
+
ctrl_inner.className = "_paintBrush-ctrlinner";
|
|
1154
|
+
const a_undo = document.createElement("a");
|
|
1155
|
+
a_undo.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--undo";
|
|
1156
|
+
a_undo.addEventListener("click", (e) => {
|
|
1157
|
+
var _a;
|
|
1158
|
+
e.stopPropagation();
|
|
1159
|
+
if (this.configs.onClickUndo) {
|
|
1160
|
+
this.configs.onClickUndo();
|
|
1161
|
+
}
|
|
1162
|
+
if (!this.canvas[this.uuid] || !this.data[this.uuid] || this.data[this.uuid].length === 0) {
|
|
696
1163
|
return;
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
1164
|
+
}
|
|
1165
|
+
const popState = this.data[this.uuid].pop();
|
|
1166
|
+
if (popState) {
|
|
1167
|
+
this.emitStateChange({
|
|
1168
|
+
type: PaintBrushTypeEnum.Undo,
|
|
1169
|
+
color: this.color,
|
|
1170
|
+
ready: this.ready,
|
|
1171
|
+
state: popState,
|
|
1172
|
+
uuid: this.uuid
|
|
1173
|
+
});
|
|
1174
|
+
}
|
|
1175
|
+
const $ctx = (_a = this.canvas[this.uuid]) == null ? void 0 : _a.getContext("2d");
|
|
1176
|
+
if (!this.canvas[this.uuid]) {
|
|
707
1177
|
return;
|
|
708
|
-
|
|
709
|
-
|
|
1178
|
+
}
|
|
1179
|
+
const { width, height } = this.canvas[this.uuid];
|
|
1180
|
+
if ($ctx) {
|
|
1181
|
+
$ctx.clearRect(0, 0, width, height);
|
|
1182
|
+
}
|
|
1183
|
+
this.data[this.uuid].forEach((ld) => this.handleDrawLine(this.uuid, ld, { withUndo: true }));
|
|
710
1184
|
});
|
|
711
|
-
const
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
})
|
|
1185
|
+
const a_close = document.createElement("a");
|
|
1186
|
+
a_close.className = "_paintBrush-ctrlitem _paintBrush-ctrlitem--close";
|
|
1187
|
+
a_close.addEventListener("click", (e) => {
|
|
1188
|
+
e.stopPropagation();
|
|
1189
|
+
this.closeBrush();
|
|
1190
|
+
if (this.configs.onClickClose) {
|
|
1191
|
+
this.configs.onClickClose();
|
|
1192
|
+
}
|
|
1193
|
+
});
|
|
1194
|
+
const $A = [a_undo, a_close];
|
|
1195
|
+
$A.forEach(($a) => {
|
|
1196
|
+
const $i = document.createElement("i");
|
|
1197
|
+
$i.className = "brush-icon";
|
|
1198
|
+
const $span = document.createElement("span");
|
|
1199
|
+
$span.className = "brush-txt";
|
|
1200
|
+
$span.innerText = $a.className.endsWith("undo") ? this.configs.onUndoText : this.configs.onExitText;
|
|
1201
|
+
$a.appendChild($i);
|
|
1202
|
+
$a.appendChild($span);
|
|
1203
|
+
});
|
|
1204
|
+
ctrl_inner.appendChild(a_undo);
|
|
1205
|
+
ctrl_inner.appendChild(a_close);
|
|
1206
|
+
ctrl.appendChild(ctrl_inner);
|
|
1207
|
+
this.container.appendChild(ctrl);
|
|
1208
|
+
return ctrl;
|
|
720
1209
|
}
|
|
721
1210
|
openBrush() {
|
|
722
1211
|
if (this.ready)
|
|
723
1212
|
return;
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
1213
|
+
if (!this.canvas[this.uuid]) {
|
|
1214
|
+
this.canvas[this.uuid] = this.initCanvas("_paintBrush-canvas");
|
|
1215
|
+
}
|
|
1216
|
+
this.container.className = "brushing";
|
|
1217
|
+
const $curCanvas = this.canvas[this.uuid];
|
|
1218
|
+
const $ctx = $curCanvas.getContext("2d");
|
|
1219
|
+
$ctx.clearRect(0, 0, $curCanvas.width, $curCanvas.height);
|
|
1220
|
+
this.openBrushHandle();
|
|
1221
|
+
this.ready = true;
|
|
1222
|
+
this.emit("readyChange", true);
|
|
727
1223
|
}
|
|
728
1224
|
closeBrush() {
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
1225
|
+
if (!this.ready)
|
|
1226
|
+
return;
|
|
1227
|
+
this.container.className = "";
|
|
1228
|
+
this.data = {};
|
|
1229
|
+
this.tempLine = {};
|
|
1230
|
+
Object.keys(this.canvas).forEach((key) => {
|
|
1231
|
+
this.canvas[key].ontouchstart = () => false;
|
|
1232
|
+
this.canvas[key].ontouchmove = () => false;
|
|
1233
|
+
this.canvas[key].ontouchend = () => false;
|
|
1234
|
+
this.canvas[key].ontouchcancel = () => false;
|
|
1235
|
+
const $ctx = this.canvas[key].getContext("2d");
|
|
1236
|
+
if ($ctx) {
|
|
1237
|
+
$ctx.clearRect(0, 0, this.canvas[key].width, this.canvas[key].height);
|
|
1238
|
+
}
|
|
1239
|
+
});
|
|
1240
|
+
this.ready = false;
|
|
1241
|
+
this.emit("readyChange", false);
|
|
1242
|
+
this.emitStateChange({
|
|
1243
|
+
type: PaintBrushTypeEnum.Exit,
|
|
735
1244
|
color: this.color,
|
|
736
|
-
ready:
|
|
1245
|
+
ready: false,
|
|
737
1246
|
uuid: this.uuid
|
|
738
|
-
})
|
|
1247
|
+
});
|
|
739
1248
|
}
|
|
740
|
-
updateCurrentColor(
|
|
741
|
-
const
|
|
742
|
-
if (!
|
|
1249
|
+
updateCurrentColor(color) {
|
|
1250
|
+
const currentCanvas = this.canvas[this.uuid];
|
|
1251
|
+
if (!currentCanvas)
|
|
1252
|
+
return;
|
|
1253
|
+
const currentCtx = currentCanvas.getContext("2d");
|
|
1254
|
+
if (!currentCtx)
|
|
743
1255
|
return;
|
|
744
|
-
|
|
745
|
-
|
|
1256
|
+
this.configs.currentColor = color;
|
|
1257
|
+
currentCtx.strokeStyle = color;
|
|
746
1258
|
}
|
|
747
1259
|
openBrushHandle() {
|
|
748
|
-
const
|
|
749
|
-
if (!
|
|
1260
|
+
const currentCanvas = this.canvas[this.uuid];
|
|
1261
|
+
if (!currentCanvas)
|
|
750
1262
|
return;
|
|
751
|
-
const
|
|
752
|
-
if (!
|
|
1263
|
+
const currentCtx = currentCanvas.getContext("2d");
|
|
1264
|
+
if (!currentCtx)
|
|
753
1265
|
return;
|
|
754
|
-
const
|
|
755
|
-
|
|
756
|
-
let
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
1266
|
+
const color = this.color || "#6D92FF";
|
|
1267
|
+
currentCtx.strokeStyle = color;
|
|
1268
|
+
let begin = null;
|
|
1269
|
+
let points = [];
|
|
1270
|
+
let move;
|
|
1271
|
+
let line = [];
|
|
1272
|
+
let startTime = 0;
|
|
1273
|
+
const draw = (beginPoint, controlPoint, endPoint) => {
|
|
1274
|
+
const color2 = this.color || "#ff0000";
|
|
1275
|
+
currentCtx.strokeStyle = color2;
|
|
1276
|
+
currentCtx.beginPath();
|
|
1277
|
+
currentCtx.moveTo(beginPoint.x, beginPoint.y);
|
|
1278
|
+
currentCtx.quadraticCurveTo(controlPoint.x, controlPoint.y, endPoint.x, endPoint.y);
|
|
1279
|
+
currentCtx.stroke();
|
|
1280
|
+
};
|
|
1281
|
+
currentCanvas.onmousedown = (e) => {
|
|
1282
|
+
e.preventDefault();
|
|
1283
|
+
startTime = Date.now();
|
|
1284
|
+
const x = e.clientX;
|
|
1285
|
+
const y = e.clientY;
|
|
1286
|
+
points = [];
|
|
1287
|
+
points.push({ x, y });
|
|
1288
|
+
begin = { x, y };
|
|
1289
|
+
move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
|
|
1290
|
+
line = [];
|
|
1291
|
+
};
|
|
1292
|
+
currentCanvas.onmousemove = (e) => {
|
|
1293
|
+
e.preventDefault();
|
|
1294
|
+
if (!begin)
|
|
767
1295
|
return;
|
|
768
|
-
const
|
|
769
|
-
|
|
1296
|
+
const x = Number(e.clientX);
|
|
1297
|
+
const y = Number(e.clientY);
|
|
1298
|
+
if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5) {
|
|
770
1299
|
return;
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
if (
|
|
1300
|
+
}
|
|
1301
|
+
points.push({ x, y });
|
|
1302
|
+
line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
|
|
1303
|
+
if (points.length < 3) {
|
|
1304
|
+
return;
|
|
1305
|
+
}
|
|
1306
|
+
const { control, end } = getQuadraticCurvePoint(points);
|
|
1307
|
+
if (!control || !end) {
|
|
775
1308
|
return;
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
1309
|
+
}
|
|
1310
|
+
draw(begin, control, end);
|
|
1311
|
+
begin = end;
|
|
1312
|
+
};
|
|
1313
|
+
currentCanvas.onmouseup = (e) => {
|
|
1314
|
+
e.preventDefault();
|
|
1315
|
+
begin = null;
|
|
1316
|
+
if (points.length < 3)
|
|
1317
|
+
return;
|
|
1318
|
+
if (!this.data[this.uuid]) {
|
|
1319
|
+
this.data[this.uuid] = [];
|
|
1320
|
+
}
|
|
1321
|
+
const duration = Date.now() - startTime;
|
|
1322
|
+
const state2 = {
|
|
1323
|
+
move: Object.assign({}, move),
|
|
779
1324
|
uuid: this.uuid,
|
|
780
|
-
line: [...
|
|
1325
|
+
line: [...line],
|
|
781
1326
|
color: this.color,
|
|
782
|
-
duration:
|
|
1327
|
+
duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
|
|
783
1328
|
// 单次笔迹时长超过2000ms不加动画
|
|
784
1329
|
};
|
|
785
|
-
this.data[this.uuid].push(
|
|
1330
|
+
this.data[this.uuid].push(state2);
|
|
1331
|
+
nextFrame(() => {
|
|
786
1332
|
this.emitStateChange({
|
|
787
|
-
type:
|
|
1333
|
+
type: PaintBrushTypeEnum.Drawline,
|
|
788
1334
|
color: this.color,
|
|
789
1335
|
ready: this.ready,
|
|
790
|
-
state:
|
|
1336
|
+
state: state2,
|
|
791
1337
|
uuid: this.uuid
|
|
792
1338
|
});
|
|
793
1339
|
});
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
1340
|
+
};
|
|
1341
|
+
currentCanvas.ontouchstart = (e) => {
|
|
1342
|
+
e.preventDefault();
|
|
1343
|
+
startTime = Date.now();
|
|
1344
|
+
const x = e.touches[0].clientX;
|
|
1345
|
+
const y = e.touches[0].clientY;
|
|
1346
|
+
points = [];
|
|
1347
|
+
points.push({ x, y });
|
|
1348
|
+
begin = { x, y };
|
|
1349
|
+
move = transformCoords({ x, y }, this.clientWidth, this.clientHeight);
|
|
1350
|
+
line = [];
|
|
1351
|
+
};
|
|
1352
|
+
currentCanvas.ontouchmove = (e) => {
|
|
1353
|
+
e.preventDefault();
|
|
1354
|
+
if (!begin)
|
|
1355
|
+
return;
|
|
1356
|
+
const x = Number(e.touches[0].clientX);
|
|
1357
|
+
const y = Number(e.touches[0].clientY);
|
|
1358
|
+
if (Math.abs(x - begin.x) < 5 && Math.abs(y - begin.y) < 5)
|
|
1359
|
+
return;
|
|
1360
|
+
points.push({ x, y });
|
|
1361
|
+
line.push(transformCoords({ x, y }, this.clientWidth, this.clientHeight));
|
|
1362
|
+
if (points.length < 3)
|
|
800
1363
|
return;
|
|
801
|
-
const
|
|
802
|
-
if (
|
|
1364
|
+
const { control, end } = getQuadraticCurvePoint(points);
|
|
1365
|
+
if (!control || !end)
|
|
803
1366
|
return;
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
}
|
|
807
|
-
|
|
1367
|
+
draw(begin, control, end);
|
|
1368
|
+
begin = end;
|
|
1369
|
+
};
|
|
1370
|
+
currentCanvas.ontouchend = currentCanvas.ontouchcancel = (e) => {
|
|
1371
|
+
e.preventDefault();
|
|
1372
|
+
begin = null;
|
|
1373
|
+
if (points.length < 3)
|
|
808
1374
|
return;
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
1375
|
+
if (!this.data[this.uuid]) {
|
|
1376
|
+
this.data[this.uuid] = [];
|
|
1377
|
+
}
|
|
1378
|
+
const duration = Date.now() - startTime;
|
|
1379
|
+
const state2 = {
|
|
1380
|
+
move: Object.assign({}, move),
|
|
1381
|
+
line: [...line],
|
|
813
1382
|
uuid: this.uuid,
|
|
814
1383
|
color: this.color,
|
|
815
|
-
duration:
|
|
1384
|
+
duration: duration < 1280 ? duration : duration < 2e3 ? 1280 : 0
|
|
816
1385
|
// 单次笔迹时长超过2000ms不加动画
|
|
817
1386
|
};
|
|
818
|
-
this.data[this.uuid].push(
|
|
1387
|
+
this.data[this.uuid].push(state2);
|
|
1388
|
+
nextFrame(() => {
|
|
819
1389
|
this.emitStateChange({
|
|
820
|
-
type:
|
|
1390
|
+
type: PaintBrushTypeEnum.Drawline,
|
|
821
1391
|
color: this.color,
|
|
822
1392
|
ready: this.ready,
|
|
823
|
-
state:
|
|
1393
|
+
state: state2,
|
|
824
1394
|
uuid: this.uuid
|
|
825
1395
|
});
|
|
826
1396
|
});
|
|
827
1397
|
};
|
|
828
1398
|
}
|
|
829
|
-
emitStateChange(
|
|
830
|
-
if (
|
|
831
|
-
this.emit("stateChange",
|
|
1399
|
+
emitStateChange(action, userAction = true) {
|
|
1400
|
+
if (action.type !== PaintBrushTypeEnum.Drawline) {
|
|
1401
|
+
this.emit("stateChange", action, userAction);
|
|
832
1402
|
return;
|
|
833
1403
|
}
|
|
834
|
-
const
|
|
835
|
-
|
|
1404
|
+
const timestamp = Date.now();
|
|
1405
|
+
const state2 = action.state;
|
|
1406
|
+
if (!state2)
|
|
836
1407
|
return;
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
1408
|
+
if (!state2.line)
|
|
1409
|
+
return;
|
|
1410
|
+
const sliceCount = Math.ceil(state2.line.length / 100);
|
|
1411
|
+
for (let i = 0; i < sliceCount; i++) {
|
|
1412
|
+
const localityAction = {
|
|
840
1413
|
uuid: this.uuid,
|
|
841
1414
|
color: this.color,
|
|
842
1415
|
ready: this.ready,
|
|
843
|
-
type:
|
|
1416
|
+
type: action.type,
|
|
844
1417
|
state: {
|
|
845
1418
|
uuid: this.uuid,
|
|
846
|
-
move:
|
|
847
|
-
duration:
|
|
1419
|
+
move: state2.move,
|
|
1420
|
+
duration: state2.duration,
|
|
848
1421
|
color: this.color,
|
|
849
|
-
line:
|
|
1422
|
+
line: state2.line.slice(i * 100, (i + 1) * 100)
|
|
850
1423
|
},
|
|
851
|
-
timestamp
|
|
852
|
-
end:
|
|
1424
|
+
timestamp,
|
|
1425
|
+
end: i === sliceCount - 1
|
|
853
1426
|
};
|
|
854
|
-
|
|
855
|
-
this.emit("stateChange",
|
|
1427
|
+
execInterval(i, 20, () => {
|
|
1428
|
+
this.emit("stateChange", localityAction, userAction);
|
|
856
1429
|
});
|
|
857
1430
|
}
|
|
858
1431
|
}
|
|
859
|
-
action(
|
|
860
|
-
const { ready
|
|
861
|
-
if (!
|
|
1432
|
+
action(action) {
|
|
1433
|
+
const { ready, type, uuid: uuid2 } = action;
|
|
1434
|
+
if (!ready && this.ready) {
|
|
862
1435
|
this.closeBrush();
|
|
863
1436
|
return;
|
|
864
1437
|
}
|
|
865
|
-
if (
|
|
1438
|
+
if (ready && !this.ready) {
|
|
866
1439
|
this.openBrush();
|
|
867
1440
|
return;
|
|
868
1441
|
}
|
|
869
|
-
if (this.ready)
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
if (!g.find((D) => D === A)) {
|
|
900
|
-
if (g.push(A), h.push(L(c[A], f.clientWidth, f.clientHeight)), h.length < 3)
|
|
901
|
-
return;
|
|
902
|
-
const { control: D, end: O } = j(h);
|
|
903
|
-
if (!D || !O)
|
|
904
|
-
return;
|
|
905
|
-
o.quadraticCurveTo(D.x, D.y, O.x, O.y), o.stroke();
|
|
1442
|
+
if (!this.ready) {
|
|
1443
|
+
return;
|
|
1444
|
+
}
|
|
1445
|
+
switch (type) {
|
|
1446
|
+
case PaintBrushTypeEnum.Drawline:
|
|
1447
|
+
const { state: state2, timestamp, end } = action;
|
|
1448
|
+
if (!timestamp)
|
|
1449
|
+
return;
|
|
1450
|
+
if (!state2)
|
|
1451
|
+
return;
|
|
1452
|
+
this.tempLine[timestamp] = [].concat(this.tempLine[timestamp] || [], state2.line);
|
|
1453
|
+
if (end) {
|
|
1454
|
+
Object.assign(state2, { line: this.tempLine[timestamp] });
|
|
1455
|
+
this.handleDrawLine(uuid2, state2, {}, () => delete this.tempLine[timestamp]);
|
|
1456
|
+
}
|
|
1457
|
+
break;
|
|
1458
|
+
case PaintBrushTypeEnum.Undo:
|
|
1459
|
+
this.handleUndo(uuid2);
|
|
1460
|
+
break;
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
handleDrawLine(_uuid, data, { withUndo = false }, callback = noop) {
|
|
1464
|
+
if (!data || Object.prototype.toString.call(data) != "[object Object]" || Object.keys(data).length === 0) {
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
queue(() => {
|
|
1468
|
+
return new Promise((resolve) => {
|
|
1469
|
+
if (!withUndo) {
|
|
1470
|
+
if (!this.canvas[_uuid]) {
|
|
1471
|
+
this.canvas[_uuid] = this.initCanvas("_paintBrush-canvas--sync");
|
|
906
1472
|
}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
for (let g = 0; g < c.length; g++) {
|
|
912
|
-
if (h.push(L(c[g], this.clientWidth, this.clientHeight)), h.length < 3)
|
|
913
|
-
continue;
|
|
914
|
-
const { control: f, end: p } = j(h);
|
|
915
|
-
!f || !p || o.quadraticCurveTo(f.x, f.y, p.x, p.y);
|
|
1473
|
+
if (!this.data[_uuid]) {
|
|
1474
|
+
this.data[_uuid] = [];
|
|
1475
|
+
}
|
|
1476
|
+
this.data[_uuid].push(data);
|
|
916
1477
|
}
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
1478
|
+
if (!this.canvas[_uuid]) {
|
|
1479
|
+
return;
|
|
1480
|
+
}
|
|
1481
|
+
const $ctx = this.canvas[_uuid].getContext("2d");
|
|
1482
|
+
if (!$ctx)
|
|
1483
|
+
return;
|
|
1484
|
+
const { line = [], color = "black", duration = 0, uuid: uuid2 } = data;
|
|
1485
|
+
const move = unTransformCoords(data.move || {}, this.clientWidth, this.clientHeight);
|
|
1486
|
+
let points = [move];
|
|
1487
|
+
$ctx.strokeStyle = color;
|
|
1488
|
+
$ctx.beginPath();
|
|
1489
|
+
$ctx.moveTo(move.x, move.y);
|
|
1490
|
+
if (duration && !withUndo) {
|
|
1491
|
+
let drawCache = [];
|
|
1492
|
+
const self = this;
|
|
1493
|
+
self.tween = tween({ step: 0 }, { step: line.length - 1 }, duration).onUpdate(({ step }) => {
|
|
1494
|
+
var _a;
|
|
1495
|
+
self.tweening = true;
|
|
1496
|
+
if (!self.ready) {
|
|
1497
|
+
$ctx.clearRect(0, 0, self.canvas[uuid2].width, self.canvas[uuid2].height);
|
|
1498
|
+
return (_a = self.tween) == null ? void 0 : _a.stop();
|
|
1499
|
+
}
|
|
1500
|
+
const i = Math.floor(step);
|
|
1501
|
+
if (!drawCache.find((dc) => dc === i)) {
|
|
1502
|
+
drawCache.push(i);
|
|
1503
|
+
points.push(unTransformCoords(line[i], self.clientWidth, self.clientHeight));
|
|
1504
|
+
if (points.length < 3)
|
|
1505
|
+
return;
|
|
1506
|
+
const { control, end } = getQuadraticCurvePoint(points);
|
|
1507
|
+
if (!control || !end)
|
|
1508
|
+
return;
|
|
1509
|
+
$ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
|
|
1510
|
+
$ctx.stroke();
|
|
1511
|
+
}
|
|
1512
|
+
}).onComplete((e) => {
|
|
1513
|
+
self.tween = void 0;
|
|
1514
|
+
self.tweening = false;
|
|
1515
|
+
drawCache = [];
|
|
1516
|
+
points = [];
|
|
1517
|
+
if (callback)
|
|
1518
|
+
callback();
|
|
1519
|
+
resolve();
|
|
1520
|
+
});
|
|
1521
|
+
} else {
|
|
1522
|
+
for (let i = 0; i < line.length; i++) {
|
|
1523
|
+
points.push(unTransformCoords(line[i], this.clientWidth, this.clientHeight));
|
|
1524
|
+
if (points.length < 3)
|
|
1525
|
+
continue;
|
|
1526
|
+
const { control, end } = getQuadraticCurvePoint(points);
|
|
1527
|
+
if (!control || !end)
|
|
1528
|
+
continue;
|
|
1529
|
+
$ctx.quadraticCurveTo(control.x, control.y, end.x, end.y);
|
|
1530
|
+
}
|
|
1531
|
+
$ctx.stroke();
|
|
1532
|
+
points = [];
|
|
1533
|
+
if (callback)
|
|
1534
|
+
callback();
|
|
1535
|
+
resolve();
|
|
1536
|
+
}
|
|
1537
|
+
});
|
|
1538
|
+
});
|
|
920
1539
|
}
|
|
921
|
-
handleUndo(
|
|
922
|
-
if (!this.canvas[
|
|
1540
|
+
handleUndo(uuid2) {
|
|
1541
|
+
if (!this.canvas[uuid2] || !this.data[uuid2] || this.data[uuid2].length === 0) {
|
|
923
1542
|
return;
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
1543
|
+
}
|
|
1544
|
+
this.data[uuid2].pop();
|
|
1545
|
+
const handle = () => {
|
|
1546
|
+
var _a;
|
|
1547
|
+
const $ctx = (_a = this.canvas[uuid2]) == null ? void 0 : _a.getContext("2d");
|
|
1548
|
+
if ($ctx) {
|
|
1549
|
+
$ctx.clearRect(0, 0, this.canvas[uuid2].width, this.canvas[uuid2].height);
|
|
1550
|
+
}
|
|
1551
|
+
this.data[uuid2].forEach((ld) => this.handleDrawLine(uuid2, ld, { withUndo: true }));
|
|
929
1552
|
};
|
|
930
1553
|
if (this.tween && this.tweening) {
|
|
931
|
-
this.tween.stop()
|
|
1554
|
+
this.tween.stop();
|
|
1555
|
+
nextFrame(handle, 60);
|
|
932
1556
|
return;
|
|
933
1557
|
}
|
|
934
|
-
|
|
1558
|
+
handle();
|
|
935
1559
|
}
|
|
936
1560
|
destroyBrush() {
|
|
937
|
-
this.closeBrush()
|
|
1561
|
+
this.closeBrush();
|
|
1562
|
+
this.ready = false;
|
|
1563
|
+
this.emit("readyChange", true);
|
|
938
1564
|
}
|
|
939
1565
|
}
|
|
940
|
-
class
|
|
941
|
-
constructor(
|
|
942
|
-
|
|
943
|
-
const
|
|
1566
|
+
class PaintBrush {
|
|
1567
|
+
constructor(configs = {}) {
|
|
1568
|
+
__publicField(this, "controller");
|
|
1569
|
+
const _configs = Object.assign({
|
|
944
1570
|
currentColor: "#f44336",
|
|
945
1571
|
onUndoText: "回退",
|
|
946
1572
|
onExitText: "关闭"
|
|
947
|
-
},
|
|
948
|
-
this.controller = new
|
|
1573
|
+
}, configs);
|
|
1574
|
+
this.controller = new Controller(_configs);
|
|
949
1575
|
}
|
|
950
|
-
on(
|
|
951
|
-
this.controller.on(
|
|
1576
|
+
on(name, callback) {
|
|
1577
|
+
this.controller.on(name, callback);
|
|
952
1578
|
}
|
|
953
|
-
off(
|
|
954
|
-
this.controller.off(
|
|
1579
|
+
off(name, callback) {
|
|
1580
|
+
this.controller.off(name, callback);
|
|
955
1581
|
}
|
|
956
|
-
once(
|
|
957
|
-
this.controller.once(
|
|
1582
|
+
once(name, callback) {
|
|
1583
|
+
this.controller.once(name, callback);
|
|
958
1584
|
}
|
|
959
1585
|
/**
|
|
960
1586
|
* 显示画笔。
|
|
@@ -962,8 +1588,8 @@ class tt {
|
|
|
962
1588
|
show() {
|
|
963
1589
|
this.controller.openBrush();
|
|
964
1590
|
}
|
|
965
|
-
action(
|
|
966
|
-
this.controller.action(
|
|
1591
|
+
action(action) {
|
|
1592
|
+
this.controller.action(action);
|
|
967
1593
|
}
|
|
968
1594
|
/**
|
|
969
1595
|
* 获取画笔状态。
|
|
@@ -984,11 +1610,12 @@ class tt {
|
|
|
984
1610
|
dispose() {
|
|
985
1611
|
return this.controller.destroyBrush();
|
|
986
1612
|
}
|
|
987
|
-
setCurrentColor(
|
|
988
|
-
this.controller.updateCurrentColor(
|
|
1613
|
+
setCurrentColor(color) {
|
|
1614
|
+
this.controller.updateCurrentColor(color);
|
|
989
1615
|
}
|
|
990
1616
|
}
|
|
991
1617
|
export {
|
|
992
|
-
|
|
993
|
-
|
|
1618
|
+
PaintBrush,
|
|
1619
|
+
PaintBrushTypeEnum
|
|
994
1620
|
};
|
|
1621
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb21wb25lbnRzL1BhaW50QnJ1c2gvdXRpbHMudHMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQHR3ZWVuanMvdHdlZW4uanMvZGlzdC90d2Vlbi5lc20uanMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3R3ZWVuLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC90eXBpbmdzLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9TdWJzY3JpYmUudHMiLCIuLi9zcmMvc2hhcmVkLXV0aWxzL3V1aWQudHMiLCIuLi9zcmMvY29tcG9uZW50cy9QYWludEJydXNoL3N0eWxlLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9Db250cm9sbGVyLnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvUGFpbnRCcnVzaC9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgfVxuY29uc3QgcHJvbWlzZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpXG5cbmNvbnN0IHN0YXRlID0ge1xuICBfX3F1ZXVlOiBQcm9taXNlLnJlc29sdmUoKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvb3JkcyB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXVlKHByb21pc2VDYWxsYmFjayA9IHByb21pc2UpIHtcbiAgc3RhdGUuX19xdWV1ZSA9IHN0YXRlLl9fcXVldWUudGhlbihwcm9taXNlQ2FsbGJhY2spLmNhdGNoKHByb21pc2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1Db29yZHMoY29vcmRzOiBDb29yZHMsIGN3OiBudW1iZXIsIGNoOiBudW1iZXIpIHtcbiAgY29uc3QgX3g6IG51bWJlciA9IGNvb3Jkcy54XG4gIGNvbnN0IF95OiBudW1iZXIgPSBjb29yZHMueVxuICBjb25zdCB4ID0gTWF0aC5mbG9vcigoX3ggLyBjdykgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICBjb25zdCB5ID0gTWF0aC5mbG9vcigoX3kgLyBjaCkgKiAxMDAwMCkgLyAxMDAwMCAgIC8vIOS/neeVmeWbm+S9jeWwj+aVsFxuICByZXR1cm4geyB4LCB5IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuVHJhbnNmb3JtQ29vcmRzKGNvb3JkczogQ29vcmRzLCBjdzogbnVtYmVyLCBjaDogbnVtYmVyKSB7XG4gIGNvbnN0IHsgeDogX3gsIHk6IF95IH0gPSBjb29yZHNcbiAgY29uc3QgeCA9IF94ICogY3dcbiAgY29uc3QgeSA9IF95ICogY2hcbiAgcmV0dXJuIHsgeCwgeSB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50czogQ29vcmRzW10pIHtcbiAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSByZXR1cm4ge31cbiAgY29uc3QgbGFzdFR3byA9IHBvaW50cy5zbGljZSgtMilcbiAgY29uc3QgY29udHJvbCA9IGxhc3RUd29bMF1cbiAgY29uc3QgZW5kID0ge1xuICAgIHg6IChsYXN0VHdvWzBdLnggKyBsYXN0VHdvWzFdLngpIC8gMixcbiAgICB5OiAobGFzdFR3b1swXS55ICsgbGFzdFR3b1sxXS55KSAvIDIsXG4gIH1cbiAgcmV0dXJuIHsgY29udHJvbCwgZW5kIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNJbnRlcnZhbChpOiBudW1iZXIsIHRpbWU6IG51bWJlciwgY2FsbGJhY2sgPSBub29wKSB7XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXNvbHZlKHRydWUpXG4gICAgfSwgdGltZSAqIGkpXG4gIH0pXG59XG5cbmNvbnN0IF93aW5kb3cgPSB3aW5kb3cgYXMgYW55XG5cbmNvbnN0IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIF93aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gIChmbiA9PiBzZXRUaW1lb3V0KGZuLCAxNikpXG5cbmNvbnN0IF9jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBfd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNsZWFyVGltZW91dFxuXG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0RnJhbWUgKGZuOiBGcmFtZVJlcXVlc3RDYWxsYmFjaywgZGVsYXkgPSAwKSB7XG4gIGlmIChkZWxheSA8PSAwKSBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKVxuICBlbHNlIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gbmV4dEZyYW1lKGZuLCBkZWxheSAtIDEpKVxufSIsIi8qKlxuICogVGhlIEVhc2UgY2xhc3MgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGVhc2luZyBmdW5jdGlvbnMgZm9yIHVzZSB3aXRoIHR3ZWVuLmpzLlxuICovXG52YXIgRWFzaW5nID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgTGluZWFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgTm9uZTogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVhZHJhdGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCAqICgyIC0gYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgtLWFtb3VudCAqIChhbW91bnQgLSAyKSAtIDEpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIEN1YmljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIC0tYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiBhbW91bnQgKyAyKTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBRdWFydGljOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDEgLSAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQgKiBhbW91bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLTAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50IC0gMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgUXVpbnRpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAtLWFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCAqIGFtb3VudCArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoKGFtb3VudCAqPSAyKSA8IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMC41ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgoYW1vdW50IC09IDIpICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICogYW1vdW50ICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgU2ludXNvaWRhbDogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gMSAtIE1hdGguc2luKCgoMS4wIC0gYW1vdW50KSAqIE1hdGguUEkpIC8gMik7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguc2luKChhbW91bnQgKiBNYXRoLlBJKSAvIDIpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgxIC0gTWF0aC5zaW4oTWF0aC5QSSAqICgwLjUgLSBhbW91bnQpKSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRXhwb25lbnRpYWw6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBJbjogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudCA9PT0gMCA/IDAgOiBNYXRoLnBvdygxMDI0LCBhbW91bnQgLSAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAxID8gMSA6IDEgLSBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChhbW91bnQgKj0gMikgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAuNSAqIE1hdGgucG93KDEwMjQsIGFtb3VudCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSArIDIpO1xuICAgICAgICB9LFxuICAgIH0pLFxuICAgIENpcmN1bGFyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSBhbW91bnQgKiBhbW91bnQpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tYW1vdW50ICogYW1vdW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gYW1vdW50ICogYW1vdW50KSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtIChhbW91bnQgLT0gMikgKiBhbW91bnQpICsgMSk7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgRWxhc3RpYzogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW1vdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gLU1hdGgucG93KDIsIDEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpO1xuICAgICAgICB9LFxuICAgICAgICBPdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbW91bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygyLCAtMTAgKiBhbW91bnQpICogTWF0aC5zaW4oKGFtb3VudCAtIDAuMSkgKiA1ICogTWF0aC5QSSkgKyAxO1xuICAgICAgICB9LFxuICAgICAgICBJbk91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW1vdW50ICo9IDI7XG4gICAgICAgICAgICBpZiAoYW1vdW50IDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMC41ICogTWF0aC5wb3coMiwgMTAgKiAoYW1vdW50IC0gMSkpICogTWF0aC5zaW4oKGFtb3VudCAtIDEuMSkgKiA1ICogTWF0aC5QSSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogTWF0aC5wb3coMiwgLTEwICogKGFtb3VudCAtIDEpKSAqIE1hdGguc2luKChhbW91bnQgLSAxLjEpICogNSAqIE1hdGguUEkpICsgMTtcbiAgICAgICAgfSxcbiAgICB9KSxcbiAgICBCYWNrOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHZhciBzID0gMS43MDE1ODtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQgPT09IDEgPyAxIDogYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKTtcbiAgICAgICAgfSxcbiAgICAgICAgT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTg7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50ID09PSAwID8gMCA6IC0tYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgKyBzKSArIDE7XG4gICAgICAgIH0sXG4gICAgICAgIEluT3V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICB2YXIgcyA9IDEuNzAxNTggKiAxLjUyNTtcbiAgICAgICAgICAgIGlmICgoYW1vdW50ICo9IDIpIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwLjUgKiAoYW1vdW50ICogYW1vdW50ICogKChzICsgMSkgKiBhbW91bnQgLSBzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMC41ICogKChhbW91bnQgLT0gMikgKiBhbW91bnQgKiAoKHMgKyAxKSAqIGFtb3VudCArIHMpICsgMik7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgQm91bmNlOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgSW46IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIHJldHVybiAxIC0gRWFzaW5nLkJvdW5jZS5PdXQoMSAtIGFtb3VudCk7XG4gICAgICAgIH0sXG4gICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgaWYgKGFtb3VudCA8IDEgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIGFtb3VudCAqIGFtb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFtb3VudCA8IDIgLyAyLjc1KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDcuNTYyNSAqIChhbW91bnQgLT0gMS41IC8gMi43NSkgKiBhbW91bnQgKyAwLjc1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYW1vdW50IDwgMi41IC8gMi43NSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuMjUgLyAyLjc1KSAqIGFtb3VudCArIDAuOTM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiA3LjU2MjUgKiAoYW1vdW50IC09IDIuNjI1IC8gMi43NSkgKiBhbW91bnQgKyAwLjk4NDM3NTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgIGlmIChhbW91bnQgPCAwLjUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRWFzaW5nLkJvdW5jZS5JbihhbW91bnQgKiAyKSAqIDAuNTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBFYXNpbmcuQm91bmNlLk91dChhbW91bnQgKiAyIC0gMSkgKiAwLjUgKyAwLjU7XG4gICAgICAgIH0sXG4gICAgfSksXG4gICAgZ2VuZXJhdGVQb3c6IGZ1bmN0aW9uIChwb3dlcikge1xuICAgICAgICBpZiAocG93ZXIgPT09IHZvaWQgMCkgeyBwb3dlciA9IDQ7IH1cbiAgICAgICAgcG93ZXIgPSBwb3dlciA8IE51bWJlci5FUFNJTE9OID8gTnVtYmVyLkVQU0lMT04gOiBwb3dlcjtcbiAgICAgICAgcG93ZXIgPSBwb3dlciA+IDEwMDAwID8gMTAwMDAgOiBwb3dlcjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEluOiBmdW5jdGlvbiAoYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KGFtb3VudCwgcG93ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIE91dDogZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC0gTWF0aC5wb3coKDEgLSBhbW91bnQpLCBwb3dlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgSW5PdXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYW1vdW50IDwgMC41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygoYW1vdW50ICogMiksIHBvd2VyKSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoMSAtIE1hdGgucG93KCgyIC0gYW1vdW50ICogMiksIHBvd2VyKSkgLyAyICsgMC41O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9LFxufSk7XG5cbnZhciBub3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcblxuLyoqXG4gKiBDb250cm9sbGluZyBncm91cHMgb2YgdHdlZW5zXG4gKlxuICogVXNpbmcgdGhlIFRXRUVOIHNpbmdsZXRvbiB0byBtYW5hZ2UgeW91ciB0d2VlbnMgY2FuIGNhdXNlIGlzc3VlcyBpbiBsYXJnZSBhcHBzIHdpdGggbWFueSBjb21wb25lbnRzLlxuICogSW4gdGhlc2UgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBjcmVhdGUgeW91ciBvd24gc21hbGxlciBncm91cHMgb2YgdHdlZW5cbiAqL1xudmFyIEdyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEdyb3VwKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHdlZW5zQWRkZWREdXJpbmdVcGRhdGUgPSB7fTtcbiAgICB9XG4gICAgR3JvdXAucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVucykubWFwKGZ1bmN0aW9uICh0d2VlbklkKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX3R3ZWVuc1t0d2VlbklkXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90d2VlbnMgPSB7fTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodHdlZW4pIHtcbiAgICAgICAgdGhpcy5fdHdlZW5zW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgICAgIHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlW3R3ZWVuLmdldElkKCldID0gdHdlZW47XG4gICAgfTtcbiAgICBHcm91cC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHR3ZWVuKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNbdHdlZW4uZ2V0SWQoKV07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZVt0d2Vlbi5nZXRJZCgpXTtcbiAgICB9O1xuICAgIEdyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgcHJlc2VydmUpIHtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKHByZXNlcnZlID09PSB2b2lkIDApIHsgcHJlc2VydmUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdHdlZW5JZHMgPSBPYmplY3Qua2V5cyh0aGlzLl90d2VlbnMpO1xuICAgICAgICBpZiAodHdlZW5JZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHdlZW5zIGFyZSB1cGRhdGVkIGluIFwiYmF0Y2hlc1wiLiBJZiB5b3UgYWRkIGEgbmV3IHR3ZWVuIGR1cmluZyBhblxuICAgICAgICAvLyB1cGRhdGUsIHRoZW4gdGhlIG5ldyB0d2VlbiB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgYmF0Y2guXG4gICAgICAgIC8vIElmIHlvdSByZW1vdmUgYSB0d2VlbiBkdXJpbmcgYW4gdXBkYXRlLCBpdCBtYXkgb3IgbWF5IG5vdCBiZSB1cGRhdGVkLlxuICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgcmVtb3ZlZCB0d2VlbiB3YXMgYWRkZWQgZHVyaW5nIHRoZSBjdXJyZW50IGJhdGNoLFxuICAgICAgICAvLyB0aGVuIGl0IHdpbGwgbm90IGJlIHVwZGF0ZWQuXG4gICAgICAgIHdoaWxlICh0d2Vlbklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl90d2VlbnNBZGRlZER1cmluZ1VwZGF0ZSA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0d2Vlbklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB0d2VlbiA9IHRoaXMuX3R3ZWVuc1t0d2Vlbklkc1tpXV07XG4gICAgICAgICAgICAgICAgdmFyIGF1dG9TdGFydCA9ICFwcmVzZXJ2ZTtcbiAgICAgICAgICAgICAgICBpZiAodHdlZW4gJiYgdHdlZW4udXBkYXRlKHRpbWUsIGF1dG9TdGFydCkgPT09IGZhbHNlICYmICFwcmVzZXJ2ZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdHdlZW5zW3R3ZWVuSWRzW2ldXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0d2VlbklkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3R3ZWVuc0FkZGVkRHVyaW5nVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBHcm91cDtcbn0oKSk7XG5cbi8qKlxuICpcbiAqL1xudmFyIEludGVycG9sYXRpb24gPSB7XG4gICAgTGluZWFyOiBmdW5jdGlvbiAodiwgaykge1xuICAgICAgICB2YXIgbSA9IHYubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGYgPSBtICogaztcbiAgICAgICAgdmFyIGkgPSBNYXRoLmZsb29yKGYpO1xuICAgICAgICB2YXIgZm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkxpbmVhcjtcbiAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlswXSwgdlsxXSwgZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4odlttXSwgdlttIC0gMV0sIG0gLSBmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4odltpXSwgdltpICsgMSA+IG0gPyBtIDogaSArIDFdLCBmIC0gaSk7XG4gICAgfSxcbiAgICBCZXppZXI6IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBiID0gMDtcbiAgICAgICAgdmFyIG4gPSB2Lmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBwdyA9IE1hdGgucG93O1xuICAgICAgICB2YXIgYm4gPSBJbnRlcnBvbGF0aW9uLlV0aWxzLkJlcm5zdGVpbjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG4gICAgICAgICAgICBiICs9IHB3KDEgLSBrLCBuIC0gaSkgKiBwdyhrLCBpKSAqIHZbaV0gKiBibihuLCBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYjtcbiAgICB9LFxuICAgIENhdG11bGxSb206IGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgIHZhciBtID0gdi5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgZiA9IG0gKiBrO1xuICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoZik7XG4gICAgICAgIHZhciBmbiA9IEludGVycG9sYXRpb24uVXRpbHMuQ2F0bXVsbFJvbTtcbiAgICAgICAgaWYgKHZbMF0gPT09IHZbbV0pIHtcbiAgICAgICAgICAgIGlmIChrIDwgMCkge1xuICAgICAgICAgICAgICAgIGkgPSBNYXRoLmZsb29yKChmID0gbSAqICgxICsgaykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbih2WyhpIC0gMSArIG0pICUgbV0sIHZbaV0sIHZbKGkgKyAxKSAlIG1dLCB2WyhpICsgMikgJSBtXSwgZiAtIGkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGsgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZbMF0gLSAoZm4odlswXSwgdlswXSwgdlsxXSwgdlsxXSwgLWYpIC0gdlswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoayA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdlttXSAtIChmbih2W21dLCB2W21dLCB2W20gLSAxXSwgdlttIC0gMV0sIGYgLSBtKSAtIHZbbV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuKHZbaSA/IGkgLSAxIDogMF0sIHZbaV0sIHZbbSA8IGkgKyAxID8gbSA6IGkgKyAxXSwgdlttIDwgaSArIDIgPyBtIDogaSArIDJdLCBmIC0gaSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFV0aWxzOiB7XG4gICAgICAgIExpbmVhcjogZnVuY3Rpb24gKHAwLCBwMSwgdCkge1xuICAgICAgICAgICAgcmV0dXJuIChwMSAtIHAwKSAqIHQgKyBwMDtcbiAgICAgICAgfSxcbiAgICAgICAgQmVybnN0ZWluOiBmdW5jdGlvbiAobiwgaSkge1xuICAgICAgICAgICAgdmFyIGZjID0gSW50ZXJwb2xhdGlvbi5VdGlscy5GYWN0b3JpYWw7XG4gICAgICAgICAgICByZXR1cm4gZmMobikgLyBmYyhpKSAvIGZjKG4gLSBpKTtcbiAgICAgICAgfSxcbiAgICAgICAgRmFjdG9yaWFsOiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGEgPSBbMV07XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGFbbl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbbl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBuOyBpID4gMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHMgKj0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYVtuXSA9IHM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICBDYXRtdWxsUm9tOiBmdW5jdGlvbiAocDAsIHAxLCBwMiwgcDMsIHQpIHtcbiAgICAgICAgICAgIHZhciB2MCA9IChwMiAtIHAwKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB2MSA9IChwMyAtIHAxKSAqIDAuNTtcbiAgICAgICAgICAgIHZhciB0MiA9IHQgKiB0O1xuICAgICAgICAgICAgdmFyIHQzID0gdCAqIHQyO1xuICAgICAgICAgICAgcmV0dXJuICgyICogcDEgLSAyICogcDIgKyB2MCArIHYxKSAqIHQzICsgKC0zICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSkgKiB0MiArIHYwICogdCArIHAxO1xuICAgICAgICB9LFxuICAgIH0sXG59O1xuXG4vKipcbiAqIFV0aWxzXG4gKi9cbnZhciBTZXF1ZW5jZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXF1ZW5jZSgpIHtcbiAgICB9XG4gICAgU2VxdWVuY2UubmV4dElkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU2VxdWVuY2UuX25leHRJZCsrO1xuICAgIH07XG4gICAgU2VxdWVuY2UuX25leHRJZCA9IDA7XG4gICAgcmV0dXJuIFNlcXVlbmNlO1xufSgpKTtcblxudmFyIG1haW5Hcm91cCA9IG5ldyBHcm91cCgpO1xuXG4vKipcbiAqIFR3ZWVuLmpzIC0gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdlZW5qcy90d2Vlbi5qcy9ncmFwaHMvY29udHJpYnV0b3JzIGZvciB0aGUgZnVsbCBsaXN0IG9mIGNvbnRyaWJ1dG9ycy5cbiAqIFRoYW5rIHlvdSBhbGwsIHlvdSdyZSBhd2Vzb21lIVxuICovXG52YXIgVHdlZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHdlZW4oX29iamVjdCwgX2dyb3VwKSB7XG4gICAgICAgIGlmIChfZ3JvdXAgPT09IHZvaWQgMCkgeyBfZ3JvdXAgPSBtYWluR3JvdXA7IH1cbiAgICAgICAgdGhpcy5fb2JqZWN0ID0gX29iamVjdDtcbiAgICAgICAgdGhpcy5fZ3JvdXAgPSBfZ3JvdXA7XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLl92YWx1ZXNTdGFydCA9IHt9O1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB7fTtcbiAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXQgPSB7fTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSAxMDAwO1xuICAgICAgICB0aGlzLl9pc0R5bmFtaWMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5pdGlhbFJlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3JlcGVhdCA9IDA7XG4gICAgICAgIHRoaXMuX3lveW8gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JldmVyc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RlbGF5VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lO1xuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHRoaXMuX2NoYWluZWRUd2VlbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pZCA9IFNlcXVlbmNlLm5leHRJZCgpO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgIH1cbiAgICBUd2Vlbi5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5pc1BsYXlpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BsYXlpbmc7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1BhdXNlZDtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5nZXREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKHRhcmdldCwgZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BsYXlpbmcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY2FsbCBUd2Vlbi50bygpIHdoaWxlIFR3ZWVuIGlzIGFscmVhZHkgc3RhcnRlZCBvciBwYXVzZWQuIFN0b3AgdGhlIFR3ZWVuIGZpcnN0LicpO1xuICAgICAgICB0aGlzLl92YWx1ZXNFbmQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IGR1cmF0aW9uIDwgMCA/IDAgOiBkdXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKGR1cmF0aW9uID09PSB2b2lkIDApIHsgZHVyYXRpb24gPSAxMDAwOyB9XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gZHVyYXRpb24gPCAwID8gMCA6IGR1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5keW5hbWljID0gZnVuY3Rpb24gKGR5bmFtaWMpIHtcbiAgICAgICAgaWYgKGR5bmFtaWMgPT09IHZvaWQgMCkgeyBkeW5hbWljID0gZmFsc2U7IH1cbiAgICAgICAgdGhpcy5faXNEeW5hbWljID0gZHluYW1pYztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAob3ZlcnJpZGVTdGFydGluZ1ZhbHVlcyA9PT0gdm9pZCAwKSB7IG92ZXJyaWRlU3RhcnRpbmdWYWx1ZXMgPSBmYWxzZTsgfVxuICAgICAgICBpZiAodGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAuYWRkKHRoaXMpO1xuICAgICAgICB0aGlzLl9yZXBlYXQgPSB0aGlzLl9pbml0aWFsUmVwZWF0O1xuICAgICAgICBpZiAodGhpcy5fcmV2ZXJzZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgcmV2ZXJzZWQgKGYuZS4gdXNpbmcgdGhlIHlveW8gZmVhdHVyZSkgdGhlbiB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBmbGlwIHRoZSB0d2VlbiBkaXJlY3Rpb24gYmFjayB0byBmb3J3YXJkLlxuICAgICAgICAgICAgdGhpcy5fcmV2ZXJzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2tGaXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gdGhpcy5fZGVsYXlUaW1lO1xuICAgICAgICBpZiAoIXRoaXMuX3Byb3BlcnRpZXNBcmVTZXRVcCB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzQXJlU2V0VXAgPSB0cnVlO1xuICAgICAgICAgICAgLy8gSWYgZHluYW1pYyBpcyBub3QgZW5hYmxlZCwgY2xvbmUgdGhlIGVuZCB2YWx1ZXMgaW5zdGVhZCBvZiB1c2luZyB0aGUgcGFzc2VkLWluIGVuZCB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgIHZhciB0bXAgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuX3ZhbHVlc0VuZClcbiAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gdGhpcy5fdmFsdWVzRW5kW3Byb3BdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc0VuZCA9IHRtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldHVwUHJvcGVydGllcyh0aGlzLl9vYmplY3QsIHRoaXMuX3ZhbHVlc1N0YXJ0LCB0aGlzLl92YWx1ZXNFbmQsIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0LCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdGFydEZyb21DdXJyZW50VmFsdWVzID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuX3NldHVwUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIF92YWx1ZXNTdGFydFJlcGVhdCwgb3ZlcnJpZGVTdGFydGluZ1ZhbHVlcykge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBfdmFsdWVzRW5kKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRWYWx1ZSA9IF9vYmplY3RbcHJvcGVydHldO1xuICAgICAgICAgICAgdmFyIHN0YXJ0VmFsdWVJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzdGFydFZhbHVlKTtcbiAgICAgICAgICAgIHZhciBwcm9wVHlwZSA9IHN0YXJ0VmFsdWVJc0FycmF5ID8gJ2FycmF5JyA6IHR5cGVvZiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgdmFyIGlzSW50ZXJwb2xhdGlvbkxpc3QgPSAhc3RhcnRWYWx1ZUlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheShfdmFsdWVzRW5kW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICAvLyBJZiBgdG8oKWAgc3BlY2lmaWVzIGEgcHJvcGVydHkgdGhhdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0LFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCBzZXQgdGhhdCBwcm9wZXJ0eSBpbiB0aGUgb2JqZWN0XG4gICAgICAgICAgICBpZiAocHJvcFR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBBcnJheSB3YXMgcHJvdmlkZWQgYXMgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGVuZFZhbHVlcyA9IF92YWx1ZXNFbmRbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGlmIChlbmRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYW4gYXJyYXkgb2YgcmVsYXRpdmUgdmFsdWVzLlxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBBcnJheSB3aXRoIHRoZSBzdGFydCB2YWx1ZSBhdCB0aGUgZnJvbnRcbiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IFtzdGFydFZhbHVlXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGVuZFZhbHVlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5faGFuZGxlUmVsYXRpdmVWYWx1ZShzdGFydFZhbHVlLCBlbmRWYWx1ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0ludGVycG9sYXRpb25MaXN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZvdW5kIGludmFsaWQgaW50ZXJwb2xhdGlvbiBsaXN0LiBTa2lwcGluZy4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0ludGVycG9sYXRpb25MaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSB1bmRlZmluZWQpIHsgLy8gaGFuZGxlIGVuZCB2YWx1ZXMgb25seSB0aGUgZmlyc3QgdGltZS4gTk9UIE5FRURFRD8gc2V0dXBQcm9wZXJ0aWVzIGlzIG5vdyBndWFyZGVkIGJ5IF9wcm9wZXJ0aWVzQXJlU2V0VXAuXG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNFbmRbcHJvcGVydHldID0gdGVtcDtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgZGVlcG5lc3Mgb2YgdGhlIHZhbHVlc1xuICAgICAgICAgICAgaWYgKChwcm9wVHlwZSA9PT0gJ29iamVjdCcgfHwgc3RhcnRWYWx1ZUlzQXJyYXkpICYmIHN0YXJ0VmFsdWUgJiYgIWlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRPYmplY3QgPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV1bcHJvcF0gPSBuZXN0ZWRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8/IHJlcGVhdCBuZXN0ZWQgdmFsdWVzPyBBbmQgeW95bz8gQW5kIGFycmF5IHZhbHVlcz9cbiAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldID0gc3RhcnRWYWx1ZUlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIHZhciBlbmRWYWx1ZXMgPSBfdmFsdWVzRW5kW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAvLyBJZiBkeW5hbWljIGlzIG5vdCBlbmFibGVkLCBjbG9uZSB0aGUgZW5kIHZhbHVlcyBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBwYXNzZWQtaW4gZW5kIHZhbHVlcy5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzRHluYW1pYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gZW5kVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wW3Byb3BdID0gZW5kVmFsdWVzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzRW5kW3Byb3BlcnR5XSA9IGVuZFZhbHVlcyA9IHRtcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBQcm9wZXJ0aWVzKG5lc3RlZE9iamVjdCwgX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSwgZW5kVmFsdWVzLCBfdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldLCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHZhbHVlLCBidXQgb25seSBvbmNlIHVubGVzcyBvdmVycmlkZSBpcyByZXF1ZXN0ZWQuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBfdmFsdWVzU3RhcnRbcHJvcGVydHldID09PSAndW5kZWZpbmVkJyB8fCBvdmVycmlkZVN0YXJ0aW5nVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfdmFsdWVzU3RhcnRbcHJvcGVydHldICo9IDEuMDsgLy8gRW5zdXJlcyB3ZSdyZSB1c2luZyBudW1iZXJzLCBub3Qgc3RyaW5nc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcnBvbGF0aW9uTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBGSVhNRT9cbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNFbmRbcHJvcGVydHldLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IF92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gfHwgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ2hhaW5TdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NoYWluU3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0b3BDaGFpbmVkVHdlZW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5yZW1vdmUodGhpcyk7XG4gICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fb25TdG9wQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX29uU3RvcENhbGxiYWNrKHRoaXMuX29iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9nb1RvRW5kID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUoSW5maW5pdHkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgIGlmICh0aW1lID09PSB2b2lkIDApIHsgdGltZSA9IG5vdygpOyB9XG4gICAgICAgIGlmICh0aGlzLl9pc1BhdXNlZCB8fCAhdGhpcy5faXNQbGF5aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3BhdXNlU3RhcnQgPSB0aW1lO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5fZ3JvdXAgJiYgdGhpcy5fZ3JvdXAucmVtb3ZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgICAgICBpZiAodGltZSA9PT0gdm9pZCAwKSB7IHRpbWUgPSBub3coKTsgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzUGF1c2VkIHx8ICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSArPSB0aW1lIC0gdGhpcy5fcGF1c2VTdGFydDtcbiAgICAgICAgdGhpcy5fcGF1c2VTdGFydCA9IDA7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLl9ncm91cCAmJiB0aGlzLl9ncm91cC5hZGQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnN0b3BDaGFpbmVkVHdlZW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5ncm91cCA9IGZ1bmN0aW9uIChncm91cCkge1xuICAgICAgICBpZiAoZ3JvdXAgPT09IHZvaWQgMCkgeyBncm91cCA9IG1haW5Hcm91cDsgfVxuICAgICAgICB0aGlzLl9ncm91cCA9IGdyb3VwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5kZWxheSA9IGZ1bmN0aW9uIChhbW91bnQpIHtcbiAgICAgICAgaWYgKGFtb3VudCA9PT0gdm9pZCAwKSB7IGFtb3VudCA9IDA7IH1cbiAgICAgICAgdGhpcy5fZGVsYXlUaW1lID0gYW1vdW50O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5yZXBlYXQgPSBmdW5jdGlvbiAodGltZXMpIHtcbiAgICAgICAgaWYgKHRpbWVzID09PSB2b2lkIDApIHsgdGltZXMgPSAwOyB9XG4gICAgICAgIHRoaXMuX2luaXRpYWxSZXBlYXQgPSB0aW1lcztcbiAgICAgICAgdGhpcy5fcmVwZWF0ID0gdGltZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnJlcGVhdERlbGF5ID0gZnVuY3Rpb24gKGFtb3VudCkge1xuICAgICAgICB0aGlzLl9yZXBlYXREZWxheVRpbWUgPSBhbW91bnQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLnlveW8gPSBmdW5jdGlvbiAoeW95bykge1xuICAgICAgICBpZiAoeW95byA9PT0gdm9pZCAwKSB7IHlveW8gPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLl95b3lvID0geW95bztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUuZWFzaW5nID0gZnVuY3Rpb24gKGVhc2luZ0Z1bmN0aW9uKSB7XG4gICAgICAgIGlmIChlYXNpbmdGdW5jdGlvbiA9PT0gdm9pZCAwKSB7IGVhc2luZ0Z1bmN0aW9uID0gRWFzaW5nLkxpbmVhci5Ob25lOyB9XG4gICAgICAgIHRoaXMuX2Vhc2luZ0Z1bmN0aW9uID0gZWFzaW5nRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLmludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoaW50ZXJwb2xhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBJbnRlcnBvbGF0aW9uLkxpbmVhcjsgfVxuICAgICAgICB0aGlzLl9pbnRlcnBvbGF0aW9uRnVuY3Rpb24gPSBpbnRlcnBvbGF0aW9uRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgVHdlZW4ucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdHdlZW5zID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB0d2VlbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zID0gdHdlZW5zO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vbkV2ZXJ5U3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBUd2Vlbi5wcm90b3R5cGUub25VcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25VcGRhdGVDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5vblJlcGVhdCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblJlcGVhdENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uQ29tcGxldGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLm9uU3RvcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblN0b3BDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHR3ZWVuIGlzIHN0aWxsIHBsYXlpbmcgYWZ0ZXIgdGhlIHVwZGF0ZSwgZmFsc2VcbiAgICAgKiBvdGhlcndpc2UgKGNhbGxpbmcgdXBkYXRlIG9uIGEgcGF1c2VkIHR3ZWVuIHN0aWxsIHJldHVybnMgdHJ1ZSBiZWNhdXNlXG4gICAgICogaXQgaXMgc3RpbGwgcGxheWluZywganVzdCBwYXVzZWQpLlxuICAgICAqL1xuICAgIFR3ZWVuLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSwgYXV0b1N0YXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRpbWUgPT09IHZvaWQgMCkgeyB0aW1lID0gbm93KCk7IH1cbiAgICAgICAgaWYgKGF1dG9TdGFydCA9PT0gdm9pZCAwKSB7IGF1dG9TdGFydCA9IHRydWU7IH1cbiAgICAgICAgaWYgKHRoaXMuX2lzUGF1c2VkKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciBwcm9wZXJ0eTtcbiAgICAgICAgdmFyIGVuZFRpbWUgPSB0aGlzLl9zdGFydFRpbWUgKyB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgaWYgKCF0aGlzLl9nb1RvRW5kICYmICF0aGlzLl9pc1BsYXlpbmcpIHtcbiAgICAgICAgICAgIGlmICh0aW1lID4gZW5kVGltZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoYXV0b1N0YXJ0KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnQodGltZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZ29Ub0VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGltZSA8IHRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uU3RhcnRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb25TdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FdmVyeVN0YXJ0Q2FsbGJhY2sodGhpcy5fb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29uRXZlcnlTdGFydENhbGxiYWNrRmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbGFwc2VkVGltZSA9IHRpbWUgLSB0aGlzLl9zdGFydFRpbWU7XG4gICAgICAgIHZhciBkdXJhdGlvbkFuZERlbGF5ID0gdGhpcy5fZHVyYXRpb24gKyAoKF9hID0gdGhpcy5fcmVwZWF0RGVsYXlUaW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLl9kZWxheVRpbWUpO1xuICAgICAgICB2YXIgdG90YWxUaW1lID0gdGhpcy5fZHVyYXRpb24gKyB0aGlzLl9yZXBlYXQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICB2YXIgY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuX2R1cmF0aW9uID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKGVsYXBzZWRUaW1lID4gdG90YWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGltZXNSZXBlYXRlZCA9IE1hdGgudHJ1bmMoZWxhcHNlZFRpbWUgLyBkdXJhdGlvbkFuZERlbGF5KTtcbiAgICAgICAgICAgIHZhciB0aW1lSW50b0N1cnJlbnRSZXBlYXQgPSBlbGFwc2VkVGltZSAtIHRpbWVzUmVwZWF0ZWQgKiBkdXJhdGlvbkFuZERlbGF5O1xuICAgICAgICAgICAgLy8gVE9ETyB1c2UgJT9cbiAgICAgICAgICAgIC8vIGNvbnN0IHRpbWVJbnRvQ3VycmVudFJlcGVhdCA9IGVsYXBzZWRUaW1lICUgZHVyYXRpb25BbmREZWxheVxuICAgICAgICAgICAgdmFyIHBvcnRpb24gPSBNYXRoLm1pbih0aW1lSW50b0N1cnJlbnRSZXBlYXQgLyBfdGhpcy5fZHVyYXRpb24sIDEpO1xuICAgICAgICAgICAgaWYgKHBvcnRpb24gPT09IDAgJiYgZWxhcHNlZFRpbWUgPT09IF90aGlzLl9kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvcnRpb247XG4gICAgICAgIH07XG4gICAgICAgIHZhciBlbGFwc2VkID0gY2FsY3VsYXRlRWxhcHNlZFBvcnRpb24oKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fZWFzaW5nRnVuY3Rpb24oZWxhcHNlZCk7XG4gICAgICAgIC8vIHByb3BlcnRpZXMgdHJhbnNmb3JtYXRpb25zXG4gICAgICAgIHRoaXMuX3VwZGF0ZVByb3BlcnRpZXModGhpcy5fb2JqZWN0LCB0aGlzLl92YWx1ZXNTdGFydCwgdGhpcy5fdmFsdWVzRW5kLCB2YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9vblVwZGF0ZUNhbGxiYWNrKHRoaXMuX29iamVjdCwgZWxhcHNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uID09PSAwIHx8IGVsYXBzZWRUaW1lID49IHRoaXMuX2R1cmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVwZWF0ID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZUNvdW50ID0gTWF0aC5taW4oTWF0aC50cnVuYygoZWxhcHNlZFRpbWUgLSB0aGlzLl9kdXJhdGlvbikgLyBkdXJhdGlvbkFuZERlbGF5KSArIDEsIHRoaXMuX3JlcGVhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmluaXRlKHRoaXMuX3JlcGVhdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwZWF0IC09IGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlYXNzaWduIHN0YXJ0aW5nIHZhbHVlcywgcmVzdGFydCBieSBtYWtpbmcgc3RhcnRUaW1lID0gbm93XG4gICAgICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3lveW8gJiYgdHlwZW9mIHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzU3RhcnRSZXBlYXRbcHJvcGVydHldICsgcGFyc2VGbG9hdCh0aGlzLl92YWx1ZXNFbmRbcHJvcGVydHldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feW95bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl95b3lvKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JldmVyc2VkID0gIXRoaXMuX3JldmVyc2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgKz0gZHVyYXRpb25BbmREZWxheSAqIGNvbXBsZXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uUmVwZWF0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXBlYXRDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkV2ZXJ5U3RhcnRDYWxsYmFja0ZpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGVDYWxsYmFjayh0aGlzLl9vYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbnVtQ2hhaW5lZFR3ZWVucyA9IHRoaXMuX2NoYWluZWRUd2VlbnMubGVuZ3RoOyBpIDwgbnVtQ2hhaW5lZFR3ZWVuczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGNoYWluZWQgdHdlZW5zIHN0YXJ0IGV4YWN0bHkgYXQgdGhlIHRpbWUgdGhleSBzaG91bGQsXG4gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGB1cGRhdGUoKWAgbWV0aG9kIHdhcyBjYWxsZWQgd2F5IHBhc3QgdGhlIGR1cmF0aW9uIG9mIHRoZSB0d2VlblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFpbmVkVHdlZW5zW2ldLnN0YXJ0KHRoaXMuX3N0YXJ0VGltZSArIHRoaXMuX2R1cmF0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fdXBkYXRlUHJvcGVydGllcyA9IGZ1bmN0aW9uIChfb2JqZWN0LCBfdmFsdWVzU3RhcnQsIF92YWx1ZXNFbmQsIHZhbHVlKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIF92YWx1ZXNFbmQpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVwZGF0ZSBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBzb3VyY2Ugb2JqZWN0XG4gICAgICAgICAgICBpZiAoX3ZhbHVlc1N0YXJ0W3Byb3BlcnR5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBfdmFsdWVzU3RhcnRbcHJvcGVydHldIHx8IDA7XG4gICAgICAgICAgICB2YXIgZW5kID0gX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgICAgICB2YXIgc3RhcnRJc0FycmF5ID0gQXJyYXkuaXNBcnJheShfb2JqZWN0W3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YXIgZW5kSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZW5kKTtcbiAgICAgICAgICAgIHZhciBpc0ludGVycG9sYXRpb25MaXN0ID0gIXN0YXJ0SXNBcnJheSAmJiBlbmRJc0FycmF5O1xuICAgICAgICAgICAgaWYgKGlzSW50ZXJwb2xhdGlvbkxpc3QpIHtcbiAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHRoaXMuX2ludGVycG9sYXRpb25GdW5jdGlvbihlbmQsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdvYmplY3QnICYmIGVuZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgRklYTUU/XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvcGVydGllcyhfb2JqZWN0W3Byb3BlcnR5XSwgc3RhcnQsIGVuZCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2VzIHJlbGF0aXZlIGVuZCB2YWx1ZXMgd2l0aCBzdGFydCBhcyBiYXNlIChlLmcuOiArMTAsIC0zKVxuICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX2hhbmRsZVJlbGF0aXZlVmFsdWUoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IG5vbiBudW1lcmljIHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIEZJWE1FP1xuICAgICAgICAgICAgICAgICAgICBfb2JqZWN0W3Byb3BlcnR5XSA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgVHdlZW4ucHJvdG90eXBlLl9oYW5kbGVSZWxhdGl2ZVZhbHVlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQuY2hhckF0KDApID09PSAnKycgfHwgZW5kLmNoYXJBdCgwKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBwYXJzZUZsb2F0KGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZW5kKTtcbiAgICB9O1xuICAgIFR3ZWVuLnByb3RvdHlwZS5fc3dhcEVuZFN0YXJ0UmVwZWF0VmFsdWVzID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgIHZhciB0bXAgPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV07XG4gICAgICAgIHZhciBlbmRWYWx1ZSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIGlmICh0eXBlb2YgZW5kVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNTdGFydFJlcGVhdFtwcm9wZXJ0eV0gKyBwYXJzZUZsb2F0KGVuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1N0YXJ0UmVwZWF0W3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc0VuZFtwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzRW5kW3Byb3BlcnR5XSA9IHRtcDtcbiAgICB9O1xuICAgIHJldHVybiBUd2Vlbjtcbn0oKSk7XG5cbnZhciBWRVJTSU9OID0gJzIzLjEuMyc7XG5cbi8qKlxuICogVHdlZW4uanMgLSBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2VlbmpzL3R3ZWVuLmpzL2dyYXBocy9jb250cmlidXRvcnMgZm9yIHRoZSBmdWxsIGxpc3Qgb2YgY29udHJpYnV0b3JzLlxuICogVGhhbmsgeW91IGFsbCwgeW91J3JlIGF3ZXNvbWUhXG4gKi9cbnZhciBuZXh0SWQgPSBTZXF1ZW5jZS5uZXh0SWQ7XG4vKipcbiAqIENvbnRyb2xsaW5nIGdyb3VwcyBvZiB0d2VlbnNcbiAqXG4gKiBVc2luZyB0aGUgVFdFRU4gc2luZ2xldG9uIHRvIG1hbmFnZSB5b3VyIHR3ZWVucyBjYW4gY2F1c2UgaXNzdWVzIGluIGxhcmdlIGFwcHMgd2l0aCBtYW55IGNvbXBvbmVudHMuXG4gKiBJbiB0aGVzZSBjYXNlcywgeW91IG1heSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBzbWFsbGVyIGdyb3VwcyBvZiB0d2VlbnMuXG4gKi9cbnZhciBUV0VFTiA9IG1haW5Hcm91cDtcbi8vIFRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGV4cG9ydCB0aGluZ3MgaW4gYSB3YXkgdGhhdCdzIGNvbXBhdGlibGUgd2l0aCBib3RoIEVTXG4vLyBNb2R1bGVzIGFuZCBDb21tb25KUywgd2l0aG91dCBidWlsZCBoYWNrcywgYW5kIHNvIGFzIG5vdCB0byBicmVhayB0aGVcbi8vIGV4aXN0aW5nIEFQSS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2lzc3Vlcy8xOTYxI2lzc3VlY29tbWVudC00MjMwMzc4ODFcbnZhciBnZXRBbGwgPSBUV0VFTi5nZXRBbGwuYmluZChUV0VFTik7XG52YXIgcmVtb3ZlQWxsID0gVFdFRU4ucmVtb3ZlQWxsLmJpbmQoVFdFRU4pO1xudmFyIGFkZCA9IFRXRUVOLmFkZC5iaW5kKFRXRUVOKTtcbnZhciByZW1vdmUgPSBUV0VFTi5yZW1vdmUuYmluZChUV0VFTik7XG52YXIgdXBkYXRlID0gVFdFRU4udXBkYXRlLmJpbmQoVFdFRU4pO1xudmFyIGV4cG9ydHMgPSB7XG4gICAgRWFzaW5nOiBFYXNpbmcsXG4gICAgR3JvdXA6IEdyb3VwLFxuICAgIEludGVycG9sYXRpb246IEludGVycG9sYXRpb24sXG4gICAgbm93OiBub3csXG4gICAgU2VxdWVuY2U6IFNlcXVlbmNlLFxuICAgIG5leHRJZDogbmV4dElkLFxuICAgIFR3ZWVuOiBUd2VlbixcbiAgICBWRVJTSU9OOiBWRVJTSU9OLFxuICAgIGdldEFsbDogZ2V0QWxsLFxuICAgIHJlbW92ZUFsbDogcmVtb3ZlQWxsLFxuICAgIGFkZDogYWRkLFxuICAgIHJlbW92ZTogcmVtb3ZlLFxuICAgIHVwZGF0ZTogdXBkYXRlLFxufTtcblxuZXhwb3J0IHsgRWFzaW5nLCBHcm91cCwgSW50ZXJwb2xhdGlvbiwgU2VxdWVuY2UsIFR3ZWVuLCBWRVJTSU9OLCBhZGQsIGV4cG9ydHMgYXMgZGVmYXVsdCwgZ2V0QWxsLCBuZXh0SWQsIG5vdywgcmVtb3ZlLCByZW1vdmVBbGwsIHVwZGF0ZSB9O1xuIiwiaW1wb3J0IHsgVHdlZW4sIEVhc2luZyB9IGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFR3ZWVuUmVzIGV4dGVuZHMgVHdlZW48YW55PiB7XG4gIG9uRGVzdHJveTogKGZuOiAoKSA9PiB2b2lkKSA9PiBhbnlcbiAgZGVzdHJveTogKCkgPT4gYW55XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0d2Vlbihmcm9tOiBhbnksIHRvOiBhbnksIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZyA9IEVhc2luZy5MaW5lYXIuTm9uZSkge1xuICBjb25zdCB0d2Vlbkluc3RhbmNlID0gbmV3IFR3ZWVuKGZyb20pLnRvKHRvLCBkdXJhdGlvbikuZWFzaW5nKGVhc2luZykuc3RhcnQoKSBhcyBUd2VlblJlc1xuXG4gIGZ1bmN0aW9uIGFuaW1hdGUodGltZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0d2Vlbkluc3RhbmNlLnVwZGF0ZSh0aW1lKSkgcmV0dXJuXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG4gIH1cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGUpXG5cbiAgcmV0dXJuIHR3ZWVuSW5zdGFuY2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuUHJvZ3Jlc3MoZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoYW1vdW50OiBudW1iZXIpID0+IG51bWJlcikge1xuICByZXR1cm4gdHdlZW4oeyBwcm9ncmVzczogMCB9LCB7IHByb2dyZXNzOiAxIH0sIGR1cmF0aW9uLCBlYXNpbmcpXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFBhaW50QnJ1c2hDb25maWdzIHtcbiAgY29udGFpbmVyPzogSFRNTERpdkVsZW1lbnRcbiAgY3VycmVudENvbG9yOiBzdHJpbmdcbiAgRFBSPzogbnVtYmVyLFxuICBvbkNsaWNrQ2xvc2U/OiAoKSA9PiB2b2lkLFxuICBvbkNsaWNrVW5kbz86ICgpID0+IHZvaWQsXG4gIG9uVW5kb1RleHQ/OiBzdHJpbmdcbiAgb25FeGl0VGV4dD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBQYWludEJydXNoRXZlbnRNYXAgPSB7XG4gIHJlYWR5Q2hhbmdlOiAocmVhZHk6IGJvb2xlYW4pID0+IHZvaWQsXG4gIHN0YXRlQ2hhbmdlOiAoc3RhdGU6IFBhaW50QnJ1c2hBY3Rpb24sIHVzZXJBY3Rpb246IGJvb2xlYW4pID0+IHZvaWQsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoU3RhdGUge1xuICBtb3ZlOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9XG4gIGxpbmU6IHt4OiBudW1iZXIsIHk6IG51bWJlcn1bXVxuICBjb2xvcjogc3RyaW5nXG4gIHV1aWQ6IHN0cmluZ1xuICBkdXJhdGlvbjogbnVtYmVyIC8vIOWNleasoeeslOi/ueaXtumVv+i2hei/hzIwMDBtc+S4jeWKoOWKqOeUu1xufVxuXG5cbmV4cG9ydCBlbnVtIFBhaW50QnJ1c2hUeXBlRW51bSB7XG4gIERyYXdsaW5lPSdEcmF3bGluZScsXG4gIFVuZG89J1VuZG8nLFxuICBFeGl0PSdFeGl0Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWludEJydXNoQWN0aW9uIHtcbiAgdXVpZDogc3RyaW5nXG4gIC8qKlxuICAgKiDnsbvlnovmnprkuL5cbiAgICovXG4gIHR5cGU6IFBhaW50QnJ1c2hUeXBlRW51bVxuICAvKipcbiAgICog6aKc6Imy6Imy5YC8XG4gICAqL1xuICBjb2xvcjogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblsLHnu6pcbiAgICovXG4gIHJlYWR5OiBib29sZWFuXG4gIC8qKlxuICAgKiDnirbmgIHlgLxcbiAgICovXG4gIHN0YXRlPzogUGFpbnRCcnVzaFN0YXRlXG4gIC8qKlxuICAgKiDml7bpl7TmiLPvvJrlvZPkvZwgdXVpZCDkvb/nlKhcbiAgICovXG4gIHRpbWVzdGFtcD86IG51bWJlclxuICAvKipcbiAgICog5piv5ZCm5piv57uT5bC+5pWw5o2uXG4gICAqL1xuICBlbmQ/OiBib29sZWFuXG59XG4iLCIvLyB0eXBlIFVuaXF1ZVN5bWJvbCA9IFJldHVyblR5cGU8KGE6IHN0cmluZykgPT4geyByZWFkb25seSAwOiB1bmlxdWUgc3ltYm9sIH1bMF0+O1xuLy9cbi8vIGZ1bmN0aW9uIGNyZWF0ZVN5bWJvbChkZXNjcmlwdGlvbjogc3RyaW5nKTogVW5pcXVlU3ltYm9sIHtcbi8vICAgLy8gVE9ETyDop6PlhrPmj5DnpLpcbi8vICAgLy8gQHRzLWlnbm9yZVxuLy8gICByZXR1cm4gdHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiA/IGAkU3ltYm9sPCR7ZGVzY3JpcHRpb259PiRgIDogU3ltYm9sKGRlc2NyaXB0aW9uKTtcbi8vIH1cbi8vXG4vLyBjb25zdCBFVkVOVF9TWU1CT0wgPSBjcmVhdGVTeW1ib2woXCIkJExJVkVfRVZFTlQkJFwiKVxuXG5jb25zdCBFVkVOVF9TWU1CT0w6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woXCIkJFBBSU5UX0JSVVNIX0VWRU5UJCRcIilcblxuZXhwb3J0IHR5cGUgRXZlbnRNYXAgPSB7XG4gIFtuYW1lOiBzdHJpbmddOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQgfCBib29sZWFuLFxufVxuXG5mdW5jdGlvbiBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VCBleHRlbmRzIEV2ZW50TWFwPihpbnN0YW5jZTogYW55KToge1xuICBbS2V5IGluIGtleW9mIFRdOiBbY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS2V5XT4pID0+IFJldHVyblR5cGU8VFtLZXldPiwgb25jZTogYm9vbGVhbl1bXVxufSB7XG4gIGlmICghaW5zdGFuY2VbRVZFTlRfU1lNQk9MXSkge1xuICAgIGluc3RhbmNlW0VWRU5UX1NZTUJPTF0gPSB7fVxuICB9XG4gIHJldHVybiBpbnN0YW5jZVtFVkVOVF9TWU1CT0xdXG59XG5cbmZ1bmN0aW9uIF9fcmVtb3ZlRXZlbnRJZk5vdEV4aXN0ZWQoaW5zdGFuY2U6IGFueSkge1xuICBpZiAoIWluc3RhbmNlW0VWRU5UX1NZTUJPTF0pIHtcbiAgICBkZWxldGUgaW5zdGFuY2VbRVZFTlRfU1lNQk9MXVxuICB9XG59XG5cbi8qKlxuICog55uR5ZCs6ICF5qih5byPXG4gKiBAdGVtcGxhdGUgVCDpooTorr7nmoTnm5HlkKzlm57osIPnsbvlnotcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIG5ldyBTdWJzY3JpYmU8e1xuICogXCJmb29cIjogW2FyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nXSxcbiAqIFwiYmFyXCI6IFthcmc6IGJvb2xlYW5dLFxuICogfT4oKVxuICogYGBgXG4gKi9cbmNsYXNzIFN1YnNjcmliZTxUIGV4dGVuZHMgRXZlbnRNYXA+e1xuICAvKipcbiAgICog5Yik5pat5piv5ZCm5rOo5YaM5LqG5LqL5Lu2XG4gICAqIEBwYXJhbSBuYW1lICDkuovku7bnsbvlnotcbiAgICovXG4gIGhhc0xpc3RlbmVyKG5hbWU6IGtleW9mIFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBldmVudHMgPSBfX2dlbmVyYXRlRXZlbnRJZk5vdEV4aXN0ZWQ8VD4odGhpcylcbiAgICByZXR1cm4gZXZlbnRzICYmIGV2ZW50c1tuYW1lXSAmJiBldmVudHNbbmFtZV0ubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEBwYXJhbSAgb25jZSAgICAg5piv5ZCm5Y+q5omn6KGM5LiA5qyhXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZTogSyxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgb25jZT86IGJvb2xlYW5cbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgZXZlbnRzW25hbWVdLnB1c2goW2NhbGxiYWNrIGFzIGFueSwgb25jZSB8fCBmYWxzZV0pXG4gICAgcmV0dXJuICgpID0+IHRoaXMub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOazqOWGjOS6i+S7tijmmK/lkKblj6rmiafooYzkuIDmrKEpXG4gICAqIEBwYXJhbSAgbmFtZSAgICAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgY2FsbGJhY2sg5LqL5Lu25Zue6LCD5Ye95pWwXG4gICAqIEByZXR1cm5zIOino+mZpOS6i+S7tlxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICogQHRlbXBsYXRlIEMg5Zue6LCD5Ye95pWw5Ye95pWw5LiK5LiL5paHXG4gICAqL1xuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICBuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPixcbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMub24obmFtZSwgY2FsbGJhY2ssIHRydWUpXG4gIH1cblxuICAvKipcbiAgICog6Kej6Zmk5LqL5Lu2XG4gICAqXG4gICAqIOWmguaenCBuYW1lIOS4jeS8oOeahOivneino+mZpOWvueW6lOaJgOacieS6i+S7tlxuICAgKiDlpoLmnpwgbmFtZSwgY2FsbGJhY2sg5LiN5Lyg55qE6K+d6Kej6Zmk5omA5pyJbmFtZeeahOaJgOacieS6i+S7tlxuICAgKiBAcGFyYW0gIG5hbWUgICAgIOS6i+S7tuexu+Wei1xuICAgKiBAcGFyYW0gIGNhbGxiYWNrIOS6i+S7tuWbnuiwg+WHveaVsFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgbmFtZT86IEssXG4gICAgY2FsbGJhY2s/OiAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gUmV0dXJuVHlwZTxUW0tdPlxuICApOiB2b2lkIHtcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfX3JlbW92ZUV2ZW50SWZOb3RFeGlzdGVkKHRoaXMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gX19nZW5lcmF0ZUV2ZW50SWZOb3RFeGlzdGVkPFQ+KHRoaXMpXG4gICAgaWYgKCFldmVudHNbbmFtZV0pIGV2ZW50c1tuYW1lXSA9IFtdXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50c1tuYW1lXS5sZW5ndGggPSAwXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciAoOyBpbmRleCA8IGV2ZW50c1tuYW1lXS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChldmVudHNbbmFtZV1baW5kZXhdWzBdID09PSBjYWxsYmFjaykgYnJlYWtcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgZXZlbnRzW25hbWVdLmxlbmd0aCkge1xuICAgICAgZXZlbnRzW25hbWVdLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Kem5Y+R5LqL5Lu2XG4gICAqIEBwYXJhbSAgbmFtZSAg5LqL5Lu257G75Z6LXG4gICAqIEBwYXJhbSAgZGF0YSAg6Kem5Y+R5LqL5Lu255qE5pWw5o2uXG4gICAqIEByZXR1cm5zIGNhbmNlbGVkIOaYr+WQpuiiq+inpuWPkeWPlua2iFxuICAgKiBAdGVtcGxhdGUgSyDpooTorr7nmoTnm5HlkKzkuovku7blkI3np7BcbiAgICovXG4gIGVtaXQ8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuIHtcbiAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZVxuICAgIGNvbnN0IGV2ZW50cyA9IF9fZ2VuZXJhdGVFdmVudElmTm90RXhpc3RlZDxUPih0aGlzKVxuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW25hbWVdIHx8IFtdXG4gICAgZm9yIChsZXQgb25lIG9mIGV2ZW50LnNsaWNlKCkpIHtcbiAgICAgIGNvbnN0IFtjYWxsYmFjaywgb25jZSA9IGZhbHNlXSA9IG9uZVxuICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soLi4uZGF0YSlcbiAgICAgIGlmIChvbmNlKSB0aGlzLm9mZihuYW1lLCBjYWxsYmFjaylcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSBjYW5jZWxlZCA9IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGNhbmNlbGVkXG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdWJzY3JpYmVNaXhpblR5cGUge1xuICBleHBvcnQgaW50ZXJmYWNlIGhhc0xpc3RlbmVyPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIChuYW1lOiBrZXlvZiBUKTogYm9vbGVhblxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb248VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgICBvbmNlPzogYm9vbGVhblxuICAgICk6ICgpID0+IHZvaWRcbiAgfVxuICBleHBvcnQgaW50ZXJmYWNlIG9uY2U8VCBleHRlbmRzIEV2ZW50TWFwPiB7XG4gICAgPEsgZXh0ZW5kcyBrZXlvZiBUPihcbiAgICAgIG5hbWU6IEssXG4gICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IFJldHVyblR5cGU8VFtLXT4sXG4gICAgKTogKCkgPT4gdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2Ugb2ZmPFQgZXh0ZW5kcyBFdmVudE1hcD4ge1xuICAgIDxLIGV4dGVuZHMga2V5b2YgVD4obmFtZXM/OiBLIHwgS1tdLCBjYWxsYmFjaz86ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZFxuICB9XG4gIGV4cG9ydCBpbnRlcmZhY2UgZW1pdDxUIGV4dGVuZHMgRXZlbnRNYXA+IHtcbiAgICA8SyBleHRlbmRzIGtleW9mIFQ+KG5hbWU6IEssIC4uLmRhdGE6IFBhcmFtZXRlcnM8VFtLXT4pOiBib29sZWFuXG4gIH1cbn1cblxuZXhwb3J0IHsgU3Vic2NyaWJlIH1cbiIsIi8vIHV1aWRcbmZ1bmN0aW9uIFM0KCkge1xuICByZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpXG59XG4vKipcbiAqIOmaj+acuueUn+aIkOS4gOS4qnV1aWTlgLxcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dWlkKCkge1xuICAvLyB0aGVuIHRvIGNhbGwgaXQsIHBsdXMgc3RpdGNoIGluICc0JyBpbiB0aGUgdGhpcmQgZ3JvdXBcbiAgcmV0dXJuIChTNCgpICsgUzQoKSArICctJyArIFM0KCkgKyAnLTQnICsgUzQoKS5zdWJzdHIoMCwgMykgKyAnLScgKyBTNCgpICsgJy0nICsgUzQoKSArIFM0KCkgKyBTNCgpKS50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCB7IHV1aWQgfVxuIiwiY29uc3QgUGFpbnRCcnVzaFN0eWxlID0gYFxuPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuXG4jX2dsX3BhaW50QnJ1c2gge1xucG9zaXRpb246IGZpeGVkO1xudG9wOiAwO1xuYm90dG9tOiAwO1xubGVmdDogMDtcbnJpZ2h0OiAwO1xudHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xuei1pbmRleDogMTk5NztcbnBvaW50ZXItZXZlbnRzOiBub25lO1xub3BhY2l0eTogMDtcbnRyYW5zaXRpb246IGFsbCA1MDBtcztcbn1cblxuI19nbF9wYWludEJydXNoLmJydXNoaW5nIHtcbiAgb3BhY2l0eTogMTtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jYW52YXMtLXN5bmMge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDE7XG59XG5cbiNfZ2xfcGFpbnRCcnVzaC5icnVzaGluZyAuX3BhaW50QnJ1c2gtY2FudmFzIHtcbiAgcG9pbnRlci1ldmVudHM6IGF1dG87XG59XG5cbiNfZ2xfcGFpbnRCcnVzaCAuX3BhaW50QnJ1c2gtY3RybCB7XG4gIHdpZHRoOiAxNDBweDtcbiAgaGVpZ2h0OiA1MnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMjhweDtcbiAgcmlnaHQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwJSk7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgY29sb3I6IHdoaXRlO1xuICB6LWluZGV4OiAyO1xufVxuXG4jX2dsX3BhaW50QnJ1c2guYnJ1c2hpbmcgLl9wYWludEJydXNoLWN0cmwge1xuICBwb2ludGVyLWV2ZW50czogYXV0bztcbn1cblxuI19nbF9wYWludEJydXNoIC5fcGFpbnRCcnVzaC1jdHJsIC5fcGFpbnRCcnVzaC1jdHJsaW5uZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDI2cHg7XG4gIHBhZGRpbmc6IDhweCAxNnB4O1xuICBib3gtc2hhZG93OiAwIDJweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCBoc2woMGRlZyAwJSAwJSAvIDU3JSksIGhzbCgwZGVnIDAlIDAlIC8gNzAlKSAxMTclKTtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAzOHB4O1xuICBoZWlnaHQ6IDM4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLl9wYWludEJydXNoLWN0cmxpdGVtLS11bmRvID4uYnJ1c2gtaWNvbntcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdKU0lnZVRFOUlqUTFMalkzTlRJME9DVWlJSGd5UFNJdE1UWXVPVFl4TURJekpTSWdlVEk5SWpnMExqSXpPRFF4T1RnbElpQnBaRDBpYkdsdVpXRnlSM0poWkdsbGJuUXRNU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lEeHpkRzl3SUhOMGIzQXRZMjlzYjNJOUlpTkdSa1pHUmtZaUlHOW1abk5sZEQwaU1DVWlQand2YzNSdmNENEtJQ0FnSUNBZ0lDQWdJQ0FnUEhOMGIzQWdjM1J2Y0MxamIyeHZjajBpSTBaR1JrWkdSaUlnYzNSdmNDMXZjR0ZqYVhSNVBTSXdMak13TXpZM05qYzVNaUlnYjJabWMyVjBQU0l4TURBbElqNDhMM04wYjNBK0NpQWdJQ0FnSUNBZ1BDOXNhVzVsWVhKSGNtRmthV1Z1ZEQ0S0lDQWdJRHd2WkdWbWN6NEtJQ0FnSUR4bklITjBjbTlyWlQwaWJtOXVaU0lnYzNSeWIydGxMWGRwWkhSb1BTSXhJaUJtYVd4c1BTSnViMjVsSWlCbWFXeHNMWEoxYkdVOUltVjJaVzV2WkdRaVBnb2dJQ0FnSUNBZ0lEeG5JSFJ5WVc1elptOXliVDBpZEhKaGJuTnNZWFJsS0MweE5EQXVNREF3TURBd0xDQXROelF3TGpBd01EQXdNQ2tpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThaeUIwY21GdWMyWnZjbTA5SW5SeVlXNXpiR0YwWlNneE5EQXVNREF3TURBd0xDQTNOREF1TURBd01EQXdLU0krQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR4bklIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRFF1TURBd01EQXdMQ0F5TGprNU1EWTFPU2tpSUhOMGNtOXJaUzFzYVc1bFkyRndQU0p5YjNWdVpDSWdjM1J5YjJ0bExYZHBaSFJvUFNJeUlqNEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0dGMGFDQmtQU0pOTUN3ekxqYzFPRGMxTnpBNUlFdzVMamcwTXpjMUxETXVOelU0TnpVM01Ea2dRekV5TGpZNU1UUTJPRElzTXk0M05UZzNOVGN3T1NBeE5TdzJMakEyTnpJNE9EZzFJREUxTERndU9URTFNREEzTURrZ1F6RTFMREV4TGpjMk1qY3lOVE1nTVRJdU5qa3hORFk0TWl3eE5DNHdOekV5TlRjeElEa3VPRFF6TnpVc01UUXVNRGN4TWpVM01TQk1NU3d4TkM0d056RXlOVGN4SWlCemRISnZhMlU5SW5WeWJDZ2piR2x1WldGeVIzSmhaR2xsYm5RdE1Ta2lQand2Y0dGMGFENEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4Y0c5c2VXeHBibVVnYzNSeWIydGxQU0lqUmtaR1JrWkdJaUJ6ZEhKdmEyVXRiR2x1WldwdmFXNDlJbkp2ZFc1a0lpQndiMmx1ZEhNOUlqTXVOemt3TWpJM01EY2dOeTQxTXprMk5qQTJOQ0F3SURNdU56VTROelUzTURrZ015NDNPVEF5TWpjd055QXdJajQ4TDNCdmJIbHNhVzVsUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4TDJjK0NpQWdJQ0FnSUNBZ1BDOW5QZ29nSUNBZ1BDOW5QZ284TDNOMlp6ND0pO1xuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJTtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG59XG5cbi5fcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UgPi5icnVzaC1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpVlZSR0xUZ2lQejRLUEhOMlp5QjNhV1IwYUQwaU1qSndlQ0lnYUdWcFoyaDBQU0l5TW5CNElpQjJhV1YzUW05NFBTSXdJREFnTWpJZ01qSWlJSFpsY25OcGIyNDlJakV1TVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUkrQ2lBZ0lDQThaR1ZtY3o0S0lDQWdJQ0FnSUNBOGJHbHVaV0Z5UjNKaFpHbGxiblFnZURFOUlqVXdMakF5TURZNU15VWlJSGt4UFNJdE1UTXVOek16TXpjMU1TVWlJSGd5UFNJMU1DVWlJSGt5UFNJeE1UUXVNVEV3T1RrMEpTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVEVpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUhOMGIzQXRiM0JoWTJsMGVUMGlNQzQyTURFd05ETTBPRGdpSUc5bVpuTmxkRDBpTkRrdU16QTRORGc0TWlVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lDQWdJQ0E4YkdsdVpXRnlSM0poWkdsbGJuUWdlREU5SWpVd0pTSWdlVEU5SWpBbElpQjRNajBpTlRBbElpQjVNajBpTVRBd0pTSWdhV1E5SW14cGJtVmhja2R5WVdScFpXNTBMVElpUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjM1J2Y0NCemRHOXdMV052Ykc5eVBTSWpSa1pHUmtaR0lpQnZabVp6WlhROUlqQWxJajQ4TDNOMGIzQStDaUFnSUNBZ0lDQWdJQ0FnSUR4emRHOXdJSE4wYjNBdFkyOXNiM0k5SWlOR1JrWkdSa1lpSUc5bVpuTmxkRDBpTlRVdU9UWTRNVFV6TlNVaVBqd3ZjM1J2Y0Q0S0lDQWdJQ0FnSUNBZ0lDQWdQSE4wYjNBZ2MzUnZjQzFqYjJ4dmNqMGlJMFpHUmtaR1JpSWdiMlptYzJWMFBTSXhNREFsSWo0OEwzTjBiM0ErQ2lBZ0lDQWdJQ0FnUEM5c2FXNWxZWEpIY21Ga2FXVnVkRDRLSUNBZ0lEd3ZaR1ZtY3o0S0lDQWdJRHhuSUhOMGNtOXJaVDBpYm05dVpTSWdjM1J5YjJ0bExYZHBaSFJvUFNJeElpQm1hV3hzUFNKdWIyNWxJaUJtYVd4c0xYSjFiR1U5SW1WMlpXNXZaR1FpUGdvZ0lDQWdJQ0FnSUR4blBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Y21WamRDQm1hV3hzUFNJalJEaEVPRVE0SWlCdmNHRmphWFI1UFNJd0lpQjRQU0l3SWlCNVBTSXdJaUIzYVdSMGFEMGlNaklpSUdobGFXZG9kRDBpTWpJaVBqd3ZjbVZqZEQ0S0lDQWdJQ0FnSUNBZ0lDQWdQR2NnZEhKaGJuTm1iM0p0UFNKMGNtRnVjMnhoZEdVb05DNHdNREF3TURBc0lEVXVNREF3TURBd0tTSWdabWxzYkMxeWRXeGxQU0p1YjI1NlpYSnZJajRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHhuUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lEeHdZWFJvSUdROUlrMDNMQzB5TGprNE9ERTJOVFk0SUVNM0xqVXhNamd6TlRnMExDMHlMams0T0RFMk5UWTRJRGN1T1RNMU5UQTNNVFlzTFRJdU5qQXlNVEkxTkRrZ055NDVPVE15TnpJeU55d3RNaTR4TURRM09EWTRNU0JNT0N3dE1TNDVPRGd4TmpVMk9DQk1PQ3d4TXk0NU9UZ3hNVFEySUVNNExERTBMalUxTURNNU9UTWdOeTQxTlRJeU9EUTNOU3d4TkM0NU9UZ3hNVFEySURjc01UUXVPVGs0TVRFME5pQkROaTQwT0RjeE5qUXhOaXd4TkM0NU9UZ3hNVFEySURZdU1EWTBORGt5T0RRc01UUXVOakV5TURjME5DQTJMakF3TmpjeU56Y3pMREUwTGpFeE5EY3pOVGNnVERZc01UTXVPVGs0TVRFME5pQk1OaXd0TVM0NU9EZ3hOalUyT0NCRE5pd3RNaTQxTkRBME5UQTBNeUEyTGpRME56Y3hOVEkxTEMweUxqazRPREUyTlRZNElEY3NMVEl1T1RnNE1UWTFOamdnV2lJZ1ptbHNiRDBpZFhKc0tDTnNhVzVsWVhKSGNtRmthV1Z1ZEMweEtTSWdkSEpoYm5ObWIzSnRQU0owY21GdWMyeGhkR1VvTnk0d01EQXdNREFzSURZdU1EQTBPVGMwS1NCeWIzUmhkR1VvTFRRMUxqQXdNREF3TUNrZ2RISmhibk5zWVhSbEtDMDNMakF3TURBd01Dd2dMVFl1TURBME9UYzBLU0FpUGp3dmNHRjBhRDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGNHRjBhQ0JrUFNKTk55d3RNaTQ1T0RneE5qVTJPQ0JETnk0MU1USTRNelU0TkN3dE1pNDVPRGd4TmpVMk9DQTNMamt6TlRVd056RTJMQzB5TGpZd01qRXlOVFE1SURjdU9Ua3pNamN5TWpjc0xUSXVNVEEwTnpnMk9ERWdURGdzTFRFdU9UZzRNVFkxTmpnZ1REZ3NNVE11T1RrNE1URTBOaUJET0N3eE5DNDFOVEF6T1RreklEY3VOVFV5TWpnME56VXNNVFF1T1RrNE1URTBOaUEzTERFMExqazVPREV4TkRZZ1F6WXVORGczTVRZME1UWXNNVFF1T1RrNE1URTBOaUEyTGpBMk5EUTVNamcwTERFMExqWXhNakEzTkRRZ05pNHdNRFkzTWpjM015d3hOQzR4TVRRM016VTNJRXcyTERFekxqazVPREV4TkRZZ1REWXNMVEV1T1RnNE1UWTFOamdnUXpZc0xUSXVOVFF3TkRVd05ETWdOaTQwTkRjM01UVXlOU3d0TWk0NU9EZ3hOalUyT0NBM0xDMHlMams0T0RFMk5UWTRJRm9pSUdacGJHdzlJblZ5YkNnamJHbHVaV0Z5UjNKaFpHbGxiblF0TWlraUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLRGN1TURBd01EQXdMQ0EyTGpBd05EazNOQ2tnY205MFlYUmxLQzB4TXpVdU1EQXdNREF3S1NCMGNtRnVjMnhoZEdVb0xUY3VNREF3TURBd0xDQXROaTR3TURRNU56UXBJQ0krUEM5d1lYUm9QZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdQQzluUGdvZ0lDQWdJQ0FnSUNBZ0lDQThMMmMrQ2lBZ0lDQWdJQ0FnUEM5blBnb2dJQ0FnUEM5blBnbzhMM04yWno0PSk7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbn1cblxuPC9zdHlsZT5cbmBcblxuZXhwb3J0IGRlZmF1bHQgUGFpbnRCcnVzaFN0eWxlXG4iLCJpbXBvcnQge1xuICBxdWV1ZSxcbiAgZXhlY0ludGVydmFsLFxuICB0cmFuc2Zvcm1Db29yZHMsXG4gIHVuVHJhbnNmb3JtQ29vcmRzLFxuICBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50LFxuICBub29wLFxuICB0eXBlIENvb3JkcyxcbiAgbmV4dEZyYW1lLFxufSBmcm9tICcuL3V0aWxzJ1xuXG5pbXBvcnQgdHdlZW4sIHsgdHlwZSBUd2VlblJlcyB9IGZyb20gJy4vdHdlZW4nXG5cbmltcG9ydCB7XG4gIHR5cGUgUGFpbnRCcnVzaEFjdGlvbixcbiAgdHlwZSBQYWludEJydXNoQ29uZmlncyxcbiAgdHlwZSBQYWludEJydXNoRXZlbnRNYXAsXG4gIHR5cGUgUGFpbnRCcnVzaFN0YXRlLFxuICBQYWludEJydXNoVHlwZUVudW0sXG59IGZyb20gJy4vdHlwaW5ncydcblxuaW1wb3J0IHsgU3Vic2NyaWJlIH0gZnJvbSAnLi9TdWJzY3JpYmUnXG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkLXV0aWxzL3V1aWQnXG5pbXBvcnQgUGFpbnRCcnVzaFN0eWxlIGZyb20gJy4vc3R5bGUnXG5cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgU3Vic2NyaWJlPFBhaW50QnJ1c2hFdmVudE1hcD4ge1xuICBjb25maWdzOiBQYWludEJydXNoQ29uZmlnc1xuXG4gcHJpdmF0ZSBjbGllbnRXaWR0aDogbnVtYmVyXG4gcHJpdmF0ZSBjbGllbnRIZWlnaHQ6IG51bWJlclxuXG4gcHJpdmF0ZSByZWFkeSA9IGZhbHNlXG5cbiBwcml2YXRlIHV1aWQgPSB1dWlkKClcbiBwcml2YXRlIHR3ZWVuPzogVHdlZW5SZXNcbiBwcml2YXRlIHR3ZWVuaW5nID0gZmFsc2VcblxuIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudFxuIHByaXZhdGUgY2FudmFzOiBSZWNvcmQ8c3RyaW5nLCBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZD5cbiBwcml2YXRlIGRhdGE6IFJlY29yZDxzdHJpbmcsIFBhaW50QnJ1c2hTdGF0ZVtdPiA9IHt9XG4gcHJpdmF0ZSB0ZW1wTGluZTogUmVjb3JkPHN0cmluZywgQ29vcmRzW10+ID0ge31cblxuICBnZXQgY29sb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlncy5jdXJyZW50Q29sb3JcbiAgfVxuXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhXG4gIH1cblxuICBnZXQgZHByKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3MuRFBSIHx8IDFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZ3M6IFBhaW50QnJ1c2hDb25maWdzKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29uZmlncyA9IGNvbmZpZ3NcblxuICAgIHRoaXMuY2xpZW50V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoXG4gICAgdGhpcy5jbGllbnRIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmlmSW5zZXJ0VG9ET00oKVxuICAgIHRoaXMuY2FudmFzID0ge31cbiAgICB0aGlzLmluaXRDdHJsKClcbiAgfVxuXG4gIGlmSW5zZXJ0VG9ET00oKSB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXJcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlncy5jb250YWluZXIpIHtcbiAgICAgIHRoaXMuY29uZmlncy5jb250YWluZXIuaWQgPSAnX2dsX3BhaW50QnJ1c2gnXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuY29uZmlncy5jb250YWluZXJcbiAgICB9IGVsc2UgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGNvbnRhaW5lci5pZCA9ICdfZ2xfcGFpbnRCcnVzaCdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnX2dsX3BhaW50QnJ1c2gnKSBhcyBIVE1MRGl2RWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVyLmlubmVySFRNTCA9IFBhaW50QnJ1c2hTdHlsZVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSDliJ3lp4vljJbnlLvmnb9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGluaXRDYW52YXMoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKVxuICAgIGNhbnZhcy5jbGFzc05hbWUgPSBjbGFzc05hbWVcbiAgICBjYW52YXMud2lkdGggPSB0aGlzLmNsaWVudFdpZHRoXG4gICAgY2FudmFzLmhlaWdodCA9IHRoaXMuY2xpZW50SGVpZ2h0XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICBpZiAoIWN0eCkgcmV0dXJuXG4gICAgY3R4LmxpbmVXaWR0aCA9IDUgKiB0aGlzLmRwclxuICAgIGN0eC5saW5lQ2FwID0gJ3JvdW5kJ1xuICAgIGN0eC5saW5lSm9pbiA9ICdyb3VuZCdcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjYW52YXMpXG4gICAgcmV0dXJuIGNhbnZhc1xuICB9XG5cblxuICAvKipcbiAgICog5Yid5aeL5YyW5pON5L2c6Z2i5p2/XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpbml0Q3RybCgpIHtcbiAgICBjb25zdCBjdHJsOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybC5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybCdcbiAgICBjb25zdCBjdHJsX2lubmVyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY3RybF9pbm5lci5jbGFzc05hbWUgPSAnX3BhaW50QnJ1c2gtY3RybGlubmVyJ1xuXG4gICAgY29uc3QgYV91bmRvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgYV91bmRvLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tdW5kbydcbiAgICBhX3VuZG8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgICAvLyDngrnlh7vmkqTlm57vvJrkvpvln4vngrnkvb/nlKhcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3Mub25DbGlja1VuZG8pIHtcbiAgICAgICAgdGhpcy5jb25maWdzLm9uQ2xpY2tVbmRvKClcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIHx8ICF0aGlzLmRhdGFbdGhpcy51dWlkXSB8fCB0aGlzLmRhdGFbdGhpcy51dWlkXS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBwb3BTdGF0ZSA9IHRoaXMuZGF0YVt0aGlzLnV1aWRdLnBvcCgpXG5cbiAgICAgIGlmIChwb3BTdGF0ZSkge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLlVuZG8sXG4gICAgICAgICAgY29sb3I6IHRoaXMuY29sb3IsXG4gICAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgICAgc3RhdGU6IHBvcFN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgJGN0eCA9IHRoaXMuY2FudmFzW3RoaXMudXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXSFcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHRoaXMudXVpZCwgbGQsIHsgd2l0aFVuZG86IHRydWUgfSkpXG5cbiAgICB9KVxuICAgIGNvbnN0IGFfY2xvc2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBhX2Nsb3NlLmNsYXNzTmFtZSA9ICdfcGFpbnRCcnVzaC1jdHJsaXRlbSBfcGFpbnRCcnVzaC1jdHJsaXRlbS0tY2xvc2UnXG4gICAgYV9jbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgLy8g54K55Ye75YWz6Zet77ya5L6b5Z+L54K55L2/55SoXG4gICAgICBpZiAodGhpcy5jb25maWdzLm9uQ2xpY2tDbG9zZSkge1xuICAgICAgICB0aGlzLmNvbmZpZ3Mub25DbGlja0Nsb3NlKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgJEEgPSBbYV91bmRvLCBhX2Nsb3NlXVxuICAgICRBLmZvckVhY2goKCRhKSA9PiB7XG4gICAgICBjb25zdCAkaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKVxuICAgICAgJGkuY2xhc3NOYW1lID0gJ2JydXNoLWljb24nXG4gICAgICBjb25zdCAkc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuICAgICAgJHNwYW4uY2xhc3NOYW1lID0gJ2JydXNoLXR4dCdcblxuICAgICAgJHNwYW4uaW5uZXJUZXh0ID0gJGEuY2xhc3NOYW1lLmVuZHNXaXRoKCd1bmRvJykgPyB0aGlzLmNvbmZpZ3Mub25VbmRvVGV4dCA6IHRoaXMuY29uZmlncy5vbkV4aXRUZXh0XG4gICAgICAkYS5hcHBlbmRDaGlsZCgkaSlcbiAgICAgICRhLmFwcGVuZENoaWxkKCRzcGFuKVxuICAgIH0pXG5cbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfdW5kbylcbiAgICBjdHJsX2lubmVyLmFwcGVuZENoaWxkKGFfY2xvc2UpXG4gICAgY3RybC5hcHBlbmRDaGlsZChjdHJsX2lubmVyKVxuXG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY3RybClcblxuICAgIHJldHVybiBjdHJsXG4gIH1cblxuICBvcGVuQnJ1c2goKSB7XG4gICAgaWYgKHRoaXMucmVhZHkpIHJldHVyblxuICAgIGlmICghdGhpcy5jYW52YXNbdGhpcy51dWlkXSkge1xuICAgICAgdGhpcy5jYW52YXNbdGhpcy51dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzJylcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIuY2xhc3NOYW1lID0gJ2JydXNoaW5nJ1xuICAgIGNvbnN0ICRjdXJDYW52YXMgPSB0aGlzLmNhbnZhc1t0aGlzLnV1aWRdIVxuXG4gICAgY29uc3QgJGN0eCA9ICRjdXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKSFcbiAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCAkY3VyQ2FudmFzLndpZHRoLCAkY3VyQ2FudmFzLmhlaWdodClcbiAgICB0aGlzLm9wZW5CcnVzaEhhbmRsZSgpXG4gICAgdGhpcy5yZWFkeSA9IHRydWVcbiAgICB0aGlzLmVtaXQoJ3JlYWR5Q2hhbmdlJywgdHJ1ZSlcbiAgfVxuXG4gIGNsb3NlQnJ1c2goKSB7XG4gICAgaWYgKCF0aGlzLnJlYWR5KSByZXR1cm5cblxuICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTmFtZSA9ICcnXG4gICAgdGhpcy5kYXRhID0ge31cbiAgICB0aGlzLnRlbXBMaW5lID0ge31cbiAgICBPYmplY3Qua2V5cyh0aGlzLmNhbnZhcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoc3RhcnQgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaG1vdmUgPSAoKSA9PiBmYWxzZVxuICAgICAgdGhpcy5jYW52YXNba2V5XSEub250b3VjaGVuZCA9ICgpID0+IGZhbHNlXG4gICAgICB0aGlzLmNhbnZhc1trZXldIS5vbnRvdWNoY2FuY2VsID0gKCkgPT4gZmFsc2VcbiAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1trZXldIS5nZXRDb250ZXh0KCcyZCcpXG4gICAgICBpZiAoJGN0eCkge1xuICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmNhbnZhc1trZXldIS53aWR0aCwgdGhpcy5jYW52YXNba2V5XSEuaGVpZ2h0KVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdyZWFkeUNoYW5nZScsIGZhbHNlKVxuXG4gICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2Uoe1xuICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkV4aXQsXG4gICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlQ3VycmVudENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG4gICAgdGhpcy5jb25maWdzLmN1cnJlbnRDb2xvciA9IGNvbG9yXG4gICAgY3VycmVudEN0eC5zdHJva2VTdHlsZSA9IGNvbG9yXG5cbiAgfVxuXG4gIG9wZW5CcnVzaEhhbmRsZSgpIHtcbiAgICBjb25zdCBjdXJyZW50Q2FudmFzID0gdGhpcy5jYW52YXNbdGhpcy51dWlkXVxuICAgIGlmICghY3VycmVudENhbnZhcykgcmV0dXJuXG4gICAgY29uc3QgY3VycmVudEN0eCA9IGN1cnJlbnRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3VycmVudEN0eCkgcmV0dXJuXG5cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyM2RDkyRkYnXG5cbiAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgIGxldCBiZWdpbjogYW55ID0gbnVsbCAvLyDlvIDlp4vngrlcbiAgICBsZXQgcG9pbnRzOiBhbnlbXSA9IFtdIC8vIOWNleasoSB0b3VjaCDngrnkvY3pm4blkIhcbiAgICBsZXQgbW92ZTogQ29vcmRzXG4gICAgbGV0IGxpbmU6IENvb3Jkc1tdID0gW10gLy8g5ZCM5q2lIHRvdWNoIOeCueS9jeaVsOaNrlxuICAgIGxldCBzdGFydFRpbWUgPSAwIC8vIHRvdWNoIOW8gOWni+aXtumXtFxuXG4gICAgLy8g57uY5Yi2XG4gICAgY29uc3QgZHJhdyA9IChiZWdpblBvaW50OiBDb29yZHMsIGNvbnRyb2xQb2ludDogQ29vcmRzLCBlbmRQb2ludDogQ29vcmRzKSA9PiB7XG4gICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3IgfHwgJyNmZjAwMDAnXG4gICAgICBjdXJyZW50Q3R4LnN0cm9rZVN0eWxlID0gY29sb3JcbiAgICAgIGN1cnJlbnRDdHguYmVnaW5QYXRoKClcbiAgICAgIGN1cnJlbnRDdHgubW92ZVRvKGJlZ2luUG9pbnQueCwgYmVnaW5Qb2ludC55KVxuICAgICAgY3VycmVudEN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2xQb2ludC54LCBjb250cm9sUG9pbnQueSwgZW5kUG9pbnQueCwgZW5kUG9pbnQueSlcbiAgICAgIGN1cnJlbnRDdHguc3Ryb2tlKClcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmjInkuItcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2Vkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgY29uc3QgeCA9IGUuY2xpZW50WFxuICAgICAgY29uc3QgeSA9IGUuY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g6byg5qCH56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbm1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLmNsaWVudFgpXG4gICAgICBjb25zdCB5ID0gTnVtYmVyKGUuY2xpZW50WSlcbiAgICAgIC8vIOWvhumbhueCueS9jeeogOmHilxuICAgICAgaWYgKE1hdGguYWJzKHggLSBiZWdpbi54KSA8IDUgJiYgTWF0aC5hYnMoeSAtIGJlZ2luLnkpIDwgNSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHBvaW50cy5wdXNoKHsgeCwgeSB9KVxuICAgICAgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBsaW5lLnB1c2godHJhbnNmb3JtQ29vcmRzKHsgeCwgeSB9LCB0aGlzLmNsaWVudFdpZHRoLCB0aGlzLmNsaWVudEhlaWdodCkpXG4gICAgICAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZHJhdyhiZWdpbiwgY29udHJvbCwgZW5kKVxuICAgICAgYmVnaW4gPSBlbmRcbiAgICB9XG5cbiAgICAvLyDpvKDmoIfmnb7lvIBcbiAgICBjdXJyZW50Q2FudmFzLm9ubW91c2V1cCA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGJlZ2luID0gbnVsbFxuICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm5cblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBsaW5lOiBbLi4ubGluZV0sXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6LXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoc3RhcnQgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCB4ID0gZS50b3VjaGVzWzBdLmNsaWVudFhcbiAgICAgIGNvbnN0IHkgPSBlLnRvdWNoZXNbMF0uY2xpZW50WVxuXG4gICAgICBwb2ludHMgPSBbXVxuICAgICAgcG9pbnRzLnB1c2goeyB4LCB5IH0pXG4gICAgICBiZWdpbiA9IHsgeCwgeSB9XG5cbiAgICAgIG1vdmUgPSB0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuICAgICAgbGluZSA9IFtdXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/56e75YqoXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNobW92ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICghYmVnaW4pIHJldHVyblxuICAgICAgY29uc3QgeCA9IE51bWJlcihlLnRvdWNoZXNbMF0uY2xpZW50WClcbiAgICAgIGNvbnN0IHkgPSBOdW1iZXIoZS50b3VjaGVzWzBdLmNsaWVudFkpXG4gICAgICBpZiAoTWF0aC5hYnMoeCAtIGJlZ2luLngpIDwgNSAmJiBNYXRoLmFicyh5IC0gYmVnaW4ueSkgPCA1KSByZXR1cm4gLy8g5a+G6ZuG54K55L2N56iA6YeKXG4gICAgICBwb2ludHMucHVzaCh7IHgsIHkgfSlcbiAgICAgIGxpbmUucHVzaCh0cmFuc2Zvcm1Db29yZHMoeyB4LCB5IH0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSkgLy8g5q2k5aSE5bqU6K6w5b2V5oqY57q/5ouf5ZCI5LmL5YmN55qE54K5XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiAvLyDmipjnur/mi5/lkIjkuozmrKHotJ3loZ7lsJTmm7Lnur/oh7PlsJHpnIDopoHkuInkuKrngrlcbiAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSByZXR1cm5cbiAgICAgIGRyYXcoYmVnaW4sIGNvbnRyb2wsIGVuZClcbiAgICAgIGJlZ2luID0gZW5kXG4gICAgfVxuXG4gICAgLy8g5omL5Yq/5oyJ5Y6L56a75byAXG4gICAgY3VycmVudENhbnZhcy5vbnRvdWNoZW5kID0gY3VycmVudENhbnZhcy5vbnRvdWNoY2FuY2VsID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgYmVnaW4gPSBudWxsXG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgaWYgKCF0aGlzLmRhdGFbdGhpcy51dWlkXSkge1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXSA9IFtdXG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICBtb3ZlOiBPYmplY3QuYXNzaWduKHt9LCBtb3ZlKSxcbiAgICAgICAgbGluZTogWy4uLmxpbmVdLFxuICAgICAgICB1dWlkOiB0aGlzLnV1aWQsXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gPCAxMjgwID8gZHVyYXRpb24gOiBkdXJhdGlvbiA8IDIwMDAgPyAxMjgwIDogMCwgLy8g5Y2V5qyh56yU6L+55pe26ZW/6LaF6L+HMjAwMG1z5LiN5Yqg5Yqo55S7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGFbdGhpcy51dWlkXS5wdXNoKHN0YXRlKVxuICAgICAgLy8g5bm/5pKt5pWw5o2uXG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSh7XG4gICAgICAgICAgdHlwZTogUGFpbnRCcnVzaFR5cGVFbnVtLkRyYXdsaW5lLFxuICAgICAgICAgIGNvbG9yOiB0aGlzLmNvbG9yLFxuICAgICAgICAgIHJlYWR5OiB0aGlzLnJlYWR5LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZW1pdFN0YXRlQ2hhbmdlKGFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiwgdXNlckFjdGlvbjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgIT09IFBhaW50QnJ1c2hUeXBlRW51bS5EcmF3bGluZSkge1xuICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZScsIGFjdGlvbiwgdXNlckFjdGlvbilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICBjb25zdCBzdGF0ZSA9IGFjdGlvbi5zdGF0ZVxuICAgIGlmICghc3RhdGUpIHJldHVyblxuICAgIGlmICghc3RhdGUubGluZSkgcmV0dXJuXG4gICAgY29uc3Qgc2xpY2VDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5saW5lLmxlbmd0aCAvIDEwMClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2VDb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBsb2NhbGl0eUFjdGlvbjogUGFpbnRCcnVzaEFjdGlvbiA9IHtcbiAgICAgICAgdXVpZDogdGhpcy51dWlkLFxuICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgcmVhZHk6IHRoaXMucmVhZHksXG4gICAgICAgIHR5cGU6IGFjdGlvbi50eXBlLFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcbiAgICAgICAgICBtb3ZlOiBzdGF0ZS5tb3ZlLFxuICAgICAgICAgIGR1cmF0aW9uOiBzdGF0ZS5kdXJhdGlvbixcbiAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgICBsaW5lOiBzdGF0ZS5saW5lLnNsaWNlKGkgKiAxMDAsIChpICsgMSkgKiAxMDApLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGVuZDogaSA9PT0gc2xpY2VDb3VudCAtIDEsXG4gICAgICB9XG4gICAgICAvKiog55Sx5LqO5Y2V5qyhIHdzIOS8oOi+k+aVsOaNrumHj+i/h+Wkp++8jOS8muWvvOiHtCB3cyDmlq3mjonvvIzmiYDku6XliIbmibnkvKDmlbDmja4gKi9cbiAgICAgIGV4ZWNJbnRlcnZhbChpLCAyMCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlJywgbG9jYWxpdHlBY3Rpb24sIHVzZXJBY3Rpb24pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICBjb25zdCB7IHJlYWR5LCB0eXBlLCB1dWlkIH0gPSBhY3Rpb25cblxuICAgIGlmICghcmVhZHkgJiYgdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5YWz6Zet6Z2i5p2/XG4gICAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChyZWFkeSAmJiAhdGhpcy5yZWFkeSkge1xuICAgICAgLy8g5byA5ZCv6Z2i5p2/77ya6aaW5qyh5omT5byA55S756yU5LiN5ZCM5q2l5LiK5LiA5qyh55qE55S757q/XG4gICAgICB0aGlzLm9wZW5CcnVzaCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uRHJhd2xpbmU6XG4gICAgICAgIGNvbnN0IHsgc3RhdGUsIHRpbWVzdGFtcCwgZW5kIH0gPSBhY3Rpb25cbiAgICAgICAgaWYgKCF0aW1lc3RhbXApIHJldHVyblxuICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm5cbiAgICAgICAgdGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdID0gKFtdIGFzIENvb3Jkc1tdKS5jb25jYXQodGhpcy50ZW1wTGluZVt0aW1lc3RhbXBdIHx8IFtdLCBzdGF0ZS5saW5lKVxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZSwgeyBsaW5lOiB0aGlzLnRlbXBMaW5lW3RpbWVzdGFtcF0gfSlcbiAgICAgICAgICB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIHN0YXRlLCB7fSwgKCkgPT4gZGVsZXRlIHRoaXMudGVtcExpbmVbdGltZXN0YW1wXSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQYWludEJydXNoVHlwZUVudW0uVW5kbzpcbiAgICAgICAgdGhpcy5oYW5kbGVVbmRvKHV1aWQpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG5cbiAgaGFuZGxlRHJhd0xpbmUoX3V1aWQ6IHN0cmluZywgZGF0YTogUGFpbnRCcnVzaFN0YXRlLCB7IHdpdGhVbmRvID0gZmFsc2UgfSwgY2FsbGJhY2sgPSBub29wKSB7XG4gICAgaWYgKCFkYXRhIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSAhPSAnW29iamVjdCBPYmplY3RdJyB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHF1ZXVlKCgpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBpZiAoIXdpdGhVbmRvKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNhbnZhc1tfdXVpZF0pIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzW191dWlkXSA9IHRoaXMuaW5pdENhbnZhcygnX3BhaW50QnJ1c2gtY2FudmFzLS1zeW5jJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFbX3V1aWRdKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbX3V1aWRdID0gW11cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kYXRhW191dWlkXS5wdXNoKGRhdGEpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY2FudmFzW191dWlkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0ICRjdHggPSB0aGlzLmNhbnZhc1tfdXVpZF0hLmdldENvbnRleHQoJzJkJylcblxuICAgICAgICBpZiAoISRjdHgpIHJldHVyblxuICAgICAgICBjb25zdCB7IGxpbmUgPSBbXSwgY29sb3IgPSAnYmxhY2snLCBkdXJhdGlvbiA9IDAsIHV1aWQgfSA9IGRhdGFcbiAgICAgICAgY29uc3QgbW92ZSA9IHVuVHJhbnNmb3JtQ29vcmRzKGRhdGEubW92ZSB8fCB7fSBhcyBDb29yZHMsIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KVxuXG4gICAgICAgIGxldCBwb2ludHMgPSBbbW92ZV1cblxuICAgICAgICAkY3R4LnN0cm9rZVN0eWxlID0gY29sb3JcblxuICAgICAgICAkY3R4LmJlZ2luUGF0aCgpXG4gICAgICAgICRjdHgubW92ZVRvKG1vdmUueCwgbW92ZS55KVxuXG4gICAgICAgIGlmIChkdXJhdGlvbiAmJiAhd2l0aFVuZG8pIHtcbiAgICAgICAgICBsZXQgZHJhd0NhY2hlOiBhbnlbXSA9IFtdXG4gICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgICBzZWxmLnR3ZWVuID0gdHdlZW4oeyBzdGVwOiAwIH0sIHsgc3RlcDogbGluZS5sZW5ndGggLSAxIH0sIGR1cmF0aW9uKVxuICAgICAgICAgICAgLm9uVXBkYXRlKCh7IHN0ZXAgfSkgPT4ge1xuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gdHJ1ZVxuICAgICAgICAgICAgICBpZiAoIXNlbGYucmVhZHkpIHtcbiAgICAgICAgICAgICAgICAkY3R4LmNsZWFyUmVjdCgwLCAwLCBzZWxmLmNhbnZhc1t1dWlkXSEud2lkdGgsIHNlbGYuY2FudmFzW3V1aWRdIS5oZWlnaHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudHdlZW4/LnN0b3AoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHN0ZXApXG4gICAgICAgICAgICAgIGlmICghZHJhd0NhY2hlLmZpbmQoKGRjKSA9PiBkYyA9PT0gaSkpIHtcbiAgICAgICAgICAgICAgICBkcmF3Q2FjaGUucHVzaChpKVxuICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHNlbGYuY2xpZW50V2lkdGgsIHNlbGYuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA8IDMpIHJldHVyblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWVuZCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgICAgICAgJGN0eC5zdHJva2UoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm9uQ29tcGxldGUoKGUpID0+IHtcbiAgICAgICAgICAgICAgc2VsZi50d2VlbiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICBzZWxmLnR3ZWVuaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgZHJhd0NhY2hlID0gW11cbiAgICAgICAgICAgICAgcG9pbnRzID0gW11cbiAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpXG4gICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHVuVHJhbnNmb3JtQ29vcmRzKGxpbmVbaV0sIHRoaXMuY2xpZW50V2lkdGgsIHRoaXMuY2xpZW50SGVpZ2h0KSlcbiAgICAgICAgICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHsgY29udHJvbCwgZW5kIH0gPSBnZXRRdWFkcmF0aWNDdXJ2ZVBvaW50KHBvaW50cylcbiAgICAgICAgICAgIGlmICghY29udHJvbCB8fCAhZW5kKSBjb250aW51ZVxuICAgICAgICAgICAgJGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKGNvbnRyb2wueCwgY29udHJvbC55LCBlbmQueCwgZW5kLnkpXG4gICAgICAgICAgfVxuICAgICAgICAgICRjdHguc3Ryb2tlKClcbiAgICAgICAgICBwb2ludHMgPSBbXVxuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBoYW5kbGVVbmRvKHV1aWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYW52YXNbdXVpZF0gfHwgIXRoaXMuZGF0YVt1dWlkXSB8fCB0aGlzLmRhdGFbdXVpZF0ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5kYXRhW3V1aWRdLnBvcCgpXG5cbiAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICBjb25zdCAkY3R4ID0gdGhpcy5jYW52YXNbdXVpZF0/LmdldENvbnRleHQoJzJkJylcbiAgICAgIGlmICgkY3R4KSB7XG4gICAgICAgICRjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzW3V1aWRdIS53aWR0aCwgdGhpcy5jYW52YXNbdXVpZF0hLmhlaWdodClcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVt1dWlkXS5mb3JFYWNoKChsZDogYW55KSA9PiB0aGlzLmhhbmRsZURyYXdMaW5lKHV1aWQsIGxkLCB7IHdpdGhVbmRvOiB0cnVlIH0pKVxuICAgIH1cbiAgICBpZiAodGhpcy50d2VlbiAmJiB0aGlzLnR3ZWVuaW5nKSB7XG4gICAgICB0aGlzLnR3ZWVuLnN0b3AoKVxuICAgICAgbmV4dEZyYW1lKGhhbmRsZSwgNjApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaGFuZGxlKClcbiAgfVxuXG4gIGRlc3Ryb3lCcnVzaCgpIHtcbiAgICB0aGlzLmNsb3NlQnJ1c2goKVxuICAgIHRoaXMucmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgncmVhZHlDaGFuZ2UnLCB0cnVlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDb250cm9sbGVyIH0gZnJvbSAnLi9Db250cm9sbGVyJ1xuaW1wb3J0IHR5cGUgeyBQYWludEJydXNoQWN0aW9uLCBQYWludEJydXNoQ29uZmlncywgUGFpbnRCcnVzaEV2ZW50TWFwLCBQYWludEJydXNoU3RhdGUgfSBmcm9tICcuL3R5cGluZ3MnXG5cbmV4cG9ydCBjbGFzcyBQYWludEJydXNoIHtcblxuICBwcml2YXRlIGNvbnRyb2xsZXI6IENvbnRyb2xsZXJcblxuICBjb25zdHJ1Y3Rvcihjb25maWdzOiBQYXJ0aWFsPFBhaW50QnJ1c2hDb25maWdzPiA9IHt9KSB7XG4gICAgY29uc3QgX2NvbmZpZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGN1cnJlbnRDb2xvcjogJyNmNDQzMzYnLFxuICAgICAgb25VbmRvVGV4dDogJ+WbnumAgCcsXG4gICAgICBvbkV4aXRUZXh0OiAn5YWz6ZetJ1xuICAgIH0sIGNvbmZpZ3MpXG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihfY29uZmlncylcbiAgfVxuXG4gIG9uPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbihuYW1lLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9mZjxLIGV4dGVuZHMga2V5b2YgUGFpbnRCcnVzaEV2ZW50TWFwPihuYW1lOiBLLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogUGFyYW1ldGVyczxQYWludEJydXNoRXZlbnRNYXBbS10+KSA9PiBSZXR1cm5UeXBlPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pXG4gIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub2ZmKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cblxuICBvbmNlPEsgZXh0ZW5kcyBrZXlvZiBQYWludEJydXNoRXZlbnRNYXA+KG5hbWU6IEssXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFBhaW50QnJ1c2hFdmVudE1hcFtLXT4pID0+IFJldHVyblR5cGU8UGFpbnRCcnVzaEV2ZW50TWFwW0tdPilcbiAge1xuICAgIHRoaXMuY29udHJvbGxlci5vbmNlKG5hbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIOaYvuekuueUu+eslOOAglxuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIub3BlbkJydXNoKClcbiAgfVxuXG4gIGFjdGlvbihhY3Rpb246IFBhaW50QnJ1c2hBY3Rpb24pIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aW9uKGFjdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bnlLvnrJTnirbmgIHjgIJcbiAgICovXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLnN0YXRlXG4gIH1cblxuICBnZXQgY29uZmlncygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyLmNvbmZpZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiDplIDmr4HjgIJcbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uIOeUu+eslOW6lOivpee7tOaKpOS4gOS4qiAqKuWFqOWxgOWNleS+iyoq77yM6YeN5aSN5Yip55So44CCXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIuZGVzdHJveUJydXNoKClcbiAgfVxuXG4gIHNldEN1cnJlbnRDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250cm9sbGVyLnVwZGF0ZUN1cnJlbnRDb2xvcihjb2xvcilcbiAgfVxufVxuIl0sIm5hbWVzIjpbIkdyb3VwIiwidHdlZW4iLCJTZXF1ZW5jZSIsIlR3ZWVuIiwiUGFpbnRCcnVzaFR5cGVFbnVtIiwiY29sb3IiLCJzdGF0ZSIsInV1aWQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLFNBQVMsT0FBTztBQUFFO0FBQ3pCLE1BQU0sVUFBVSxNQUFNLFFBQVE7QUFFOUIsTUFBTSxRQUFRO0FBQUEsRUFDWixTQUFTLFFBQVEsUUFBUTtBQUMzQjtBQU9nQixTQUFBLE1BQU0sa0JBQWtCLFNBQVM7QUFDL0MsUUFBTSxVQUFVLE1BQU0sUUFBUSxLQUFLLGVBQWUsRUFBRSxNQUFNLE9BQU87QUFDbkU7QUFFZ0IsU0FBQSxnQkFBZ0IsUUFBZ0IsSUFBWSxJQUFZO0FBQ3RFLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sS0FBYSxPQUFPO0FBQzFCLFFBQU0sSUFBSSxLQUFLLE1BQU8sS0FBSyxLQUFNLEdBQUssSUFBSTtBQUMxQyxRQUFNLElBQUksS0FBSyxNQUFPLEtBQUssS0FBTSxHQUFLLElBQUk7QUFDbkMsU0FBQSxFQUFFLEdBQUc7QUFDZDtBQUVnQixTQUFBLGtCQUFrQixRQUFnQixJQUFZLElBQVk7QUFDeEUsUUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU87QUFDekIsUUFBTSxJQUFJLEtBQUs7QUFDZixRQUFNLElBQUksS0FBSztBQUNSLFNBQUEsRUFBRSxHQUFHO0FBQ2Q7QUFFTyxTQUFTLHVCQUF1QixRQUFrQjtBQUN2RCxNQUFJLE9BQU8sU0FBUztBQUFHLFdBQU87QUFDeEIsUUFBQSxVQUFVLE9BQU8sTUFBTSxFQUFFO0FBQ3pCLFFBQUEsVUFBVSxRQUFRLENBQUM7QUFDekIsUUFBTSxNQUFNO0FBQUEsSUFDVixJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSztBQUFBLElBQ25DLElBQUksUUFBUSxDQUFDLEVBQUUsSUFB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
|